2015-01-09 9 views
5

私はユーザ毎に列Xの和が、上記の例を考えると0であるようなデータのサブセットを利用したいと思い、サブセットべき次の構造グループ基準に基づいてパンダを使用してデータフレームをサブセット化する方法は?

User  X 
1  0 
1  0 
2  0 
2  0 
2  1 
3  0 
3  0 

で大きなデータセットを有します

User  X 
1  0 
1  0 
3  0 
3  0 

を次のようにのみデータをグループ化することなく、GROUPBY機能を使用してこれを行う方法があり、ユーザー1と3のための観測が含まれていますか?サブセットに個々の観測値を含めることを望みます。

+0

すべての 'X 'が> = 0であることを知っていますか、' -1、+ 1'について心配する必要はありますか? – DSM

+0

すべてのX値は> 0です – roland

答えて

5

DSM's answerは、ブール値マスクを使用して行を選択しますが、DataFrameに一意でないインデックスがあっても正常に動作します。 インデックス値を使用して行を選択する私の方法は、インデックスが一意の場合はわずかに遅く、インデックスに重複値が含まれている場合はの方がはるかに遅いです。

@roland:代わりにDSMの回答を受け入れることを検討してください。

In [16]: df.loc[df.groupby('User')['X'].filter(lambda x: x.sum() == 0).index] 
Out[16]: 
    User X 
0  1 0 
1  1 0 
5  3 0 
6  3 0 
自体によって

は、GROUPBY-フィルタはちょうどこの返します:

In [29]: df.groupby('User')['X'].filter(lambda x: x.sum() == 0) 
Out[29]: 
0 0 
1 0 
5 0 
6 0 
Name: X, dtype: int64 

いますが、そのインデックスを使用することができ、


あなたはgroupby-filter使用することができます

In [30]: df.groupby('User')['X'].filter(lambda x: x.sum() == 0).index 
Out[30]: Int64Index([0, 1, 5, 6], dtype='int64') 

df.locを使用して目的の行を選択します。ここで


は、私が使用したベンチマークです:

In [49]: df2 = pd.concat([df]*10000) # df2 has a non-unique index 

私はCtrlキー- Cをし、完了に時間がかかりすぎてたので「これをD:

In [50]: %timeit df2.loc[df2.groupby('User')['X'].filter(lambda x: x.sum() == 0).index] 

私は間違いを認識し、ユニークなインデックスを持つDataFrameを作成しました:

In [51]: df3 = df2.reset_index()  # this gives df3 a unique index 

In [52]: %timeit df3.loc[df3.groupby('User')['X'].filter(lambda x: x.sum() == 0).index] 
100 loops, best of 3: 13 ms per loop 

In [53]: %timeit df3.loc[df3.groupby("User")["X"].transform(sum) == 0] 
100 loops, best of 3: 11.4 ms per loop 

これはDSMの方法でも非ユニークなインデックスとうまく実行を示しています@のunutbuの答えの代わりとして

In [54]: %timeit df2.loc[df2.groupby("User")["X"].transform(sum) == 0] 
100 loops, best of 3: 11.2 ms per loop 
8

>>> df.loc[df.groupby("User")["X"].transform(sum) == 0] 
    User X 
0  1 0 
1  1 0 
5  3 0 
6  3 0 

もあります。これは、df -lengthブールを作成しますセレクターとして使用するシリーズ:

>>> df.groupby("User")["X"].transform(sum) == 0 
0  True 
1  True 
2 False 
3 False 
4 False 
5  True 
6  True 
dtype: bool 

transformは、groupby削減操作の結果を各グループのすべての要素に「ブロードキャスト」する場合に使用されます。それは便利です。

+0

これを料理ブックに追加するプルリクエストはできますか? (おそらくSQLセクションにも) - これは基本的にhavingステートメントです – Jeff

+0

DataFrameに一意でないインデックスがあってもうまくいくので、これは私よりもはるかに良い答えです。その場合、私の方法はかなり遅くなる可能性があります。フルブールマスクを使用した選択は、インデックス値による選択よりも堅牢です。 – unutbu

関連する問題