DSM's answer, chọn hàng bằng mặt nạ boolean, hoạt động tốt ngay cả khi DataFrame có chỉ mục không phải duy nhất. Phương pháp của tôi, chọn hàng bằng cách sử dụng giá trị chỉ mục, hơi chậm hơn khi chỉ mục là duy nhất và chậm hơn đáng kể khi chỉ mục chứa giá trị trùng lặp.
@roland: Thay vào đó, hãy xem xét chấp nhận câu trả lời của DSM.
Bạn có thể sử dụng một groupby-filter
:
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
Bằng cách riêng của mình, các groupby lọc chỉ trả về này:
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
nhưng sau đó bạn có thể sử dụng chỉ số của nó,
In [30]: df.groupby('User')['X'].filter(lambda x: x.sum() == 0).index
Out[30]: Int64Index([0, 1, 5, 6], dtype='int64')
để chọn các hàng mong muốn bằng cách sử dụng df.loc
.
Dưới đây là điểm chuẩn tôi đã sử dụng:
In [49]: df2 = pd.concat([df]*10000) # df2 has a non-unique index
tôi Ctrl - C 'd này vì nó được dùng quá lâu để hoàn thành:
In [50]: %timeit df2.loc[df2.groupby('User')['X'].filter(lambda x: x.sum() == 0).index]
Khi Tôi nhận ra sai lầm của mình, tôi đã tạo một DataFrame với một chỉ mục duy nhất:
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
Điều này cho thấy phương pháp DSM của hoạt động tốt ngay cả với một chỉ số không duy nhất:
In [54]: %timeit df2.loc[df2.groupby("User")["X"].transform(sum) == 0]
100 loops, best of 3: 11.2 ms per loop
Chúng ta biết rằng tất cả 'X' là> = 0, hay bạn cần phải lo lắng về' -1, + 1'? – DSM
tất cả các giá trị X là> = 0 – roland