Groupby和any()|所有()

时间:2016-08-08 13:24:28

标签: python pandas

我有以下pd.DataFrame

In [155]: df1
Out[155]: 
   ORDER_ID    ACQ       DATE UID
2         3  False 2014-01-03   1
3         4   True 2014-01-04   2
4         5  False 2014-01-05   3
6         7   True 2014-01-08   5
7         8  False 2014-01-08   5
9        10  False 2014-01-10   6
0        11  False 2014-01-11   6

其中每个条目都是一个订单,其值为ORDER_IDDATEUIDACQ(表示这是否是相关{{1}的第一个订单在数据集中)。

我正在尝试过滤并保留已在数据集中涵盖的时间段内完成第一个订单的用户所下的所有订单(即,此类用户的至少一个订单满足UID)。

因此,所需的输出将是:

ACQ == True

我已经设法通过以下方式实现:

   ORDER_ID    ACQ       DATE UID
3         4   True 2014-01-04   2
6         7   True 2014-01-08   5
7         8  False 2014-01-08   5

但是,当我尝试查找在数据集中涵盖的时间段之外已经完成第一个订单的用户所下的所有订单(即他们的所有订单应该满足In [156]: df1.groupby('UID').filter(lambda x: x.ACQ.any() == True) Out[156]: ORDER_ID ACQ DATE UID 3 4 True 2014-01-04 2 6 7 True 2014-01-08 5 7 8 False 2014-01-08 5 )时,我似乎丢失了。我试过这个:

ACQ == False

如何过滤掉所有订单满足In [159]: df1.groupby('UID').filter(lambda x: x.ACQ.all() == False) Out[159]: ORDER_ID ACQ DATE UID 2 3 False 2014-01-03 1 4 5 False 2014-01-05 3 6 7 True 2014-01-08 5 ## <- This order is an acquisition, therefore all orders with UID == 5 should be filtered out. 7 8 False 2014-01-08 5 9 10 False 2014-01-10 6 0 11 False 2014-01-11 6 的用户所下的所有订单?

非常感谢任何想法,谢谢!

1 个答案:

答案 0 :(得分:1)

您需要先使用条件,然后添加all

print (df1.groupby('UID').filter(lambda x: (x.ACQ == False).all()))
   ORDER_ID    ACQ        DATE  UID
2         3  False  2014-01-03    1
4         5  False  2014-01-05    3
9        10  False  2014-01-10    6
0        11  False  2014-01-11    6