2016-08-08 9 views
2

I die folgende pd.DataFrameGroupby und any() | Alle()

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 

haben, wobei jeder Eintrag ein Auftrag ist, mit Werten für ORDER_ID, DATE, UID und ACQ (gibt an, ob dies für den zugeordneten UID im Datensatz erster Ordnung) .

Ich versuche, alle Bestellungen zu filtern und zu behalten, die von Benutzern platziert wurden, die ihre erste Bestellung innerhalb des im Datensatz angegebenen Zeitraums getätigt haben (d. H. Mindestens eine der Bestellungen dieser Benutzer erfüllt ACQ == True).

So würde die gewünschte Ausgabe sein:

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 

und ich habe zu erreichen dies verwaltet von:

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 

Allerdings, wenn ich versuche, alle Aufträge zu finden, die von den Benutzern gestellt wurden die ihre erste Bestellung außerhalb des im Datensatz angegebenen Zeitraums getätigt haben (dh alle ihre Bestellungen sollten ACQ == False erfüllen) Ich scheine verloren zu sein. Ich habe dies versucht:

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 

Wie soll ich alle Ausfiltern gehen über die von den Benutzern erteilten Aufträge, die alle ihre Aufträge ACQ == False erfüllen müssen?

Alle Ideen werden sehr geschätzt, danke!

Antwort

1

Sie müssen zuerst Verwendungszustand und dann all hinzu:

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 
+0

Das war hilfreich, danke für den Tipp! – Thanos