2016-05-25 7 views
4

Iはpivot_table形成DF簡単有する:パンダは、データフレームベクトル化サンプリング

d = {'one' : ['A', 'B', 'B', 'C', 'C', 'C'], 'two' : [6., 5., 4., 3., 2., 1.],  'three' : [6., 5., 4., 3., 2., 1.], 'four' : [6., 5., 4., 3., 2., 1.]} 
    df = pd.DataFrame(d) 
    pivot = pd.pivot_table(df,index=['one','two']) 

Iがランダムに生じたピボットオブジェクトの列「1」からそれぞれ異なる元素から1行をサンプリングしたいです。 (この例では、 'A'は常にサンプリングされ、 'B'と 'C'の選択肢が増えています。)私はちょうど0.18.0バージョンのパンダを使い始めており、.sampleメソッドを認識しています。私はそれがこの一見単純な質問にいくつかの新鮮な視点のための時間だと思ったので、私はそのテーマのバリエーションをしようとしたとき、私はKeyError例外を上げる

grouped = pivot.groupby('one').apply(lambda x: x.sample(n=1, replace=False)) 

..:私は、サンプリング機能にこのような何かを適用する.groupby方法で台無し。

ありがとうございました!

答えて

3

「1」はpivot内の列が、インデックスの名前ではありませんので、KeyError例外が発生します

In [11]: pivot 
Out[11]: 
     four three 
one two 
A 6.0 6.0 6.0 
B 4.0 4.0 4.0 
    5.0 5.0 5.0 
C 1.0 1.0 1.0 
    2.0 2.0 2.0 
    3.0 3.0 3.0 

あなたはレベルの引数を使用する必要があります。

In [12]: pivot.groupby(level='one').apply(lambda x: x.sample(n=1, replace=False)) 
Out[12]: 
      four three 
one one two 
A A 6.0 6.0 6.0 
B B 4.0 4.0 4.0 
C C 1.0 1.0 1.0 

このISN」インデックスは繰り返されているので、かなり正しいです!それはas_index=Falseでわずかに良いです:

In [13]: pivot.groupby(level='one', as_index=False).apply(lambda x: x.sample(n=1)) 
Out[13]: 
      four three 
    one two 
0 A 6.0 6.0 6.0 
1 B 4.0 4.0 4.0 
2 C 2.0 2.0 2.0 

注:これはランダムたびに選びます。代替、潜在的によりパフォーマンス変形として


(つまり、サブフレーム引き出す:。。

In [21]: df.iloc[[np.random.choice(x) for x in g.indices.values()]] 
Out[21]: 
    four one three two 
1 5.0 B 5.0 5.0 
3 3.0 C 3.0 3.0 
0 6.0 A 6.0 6.0 
+0

印象的な氏ヘイデンが印象的な:) – tdunham28

関連する問題