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