2016-10-17 4 views
1

Hier ist ein Beispiel für Daten, an denen ich arbeite. (Als Pandas df)Python Pandas - Filtern von df durch die Anzahl der eindeutigen Werte innerhalb einer Gruppe

index inv Rev_stream Bill_type Net_rev 
     1 1 A   Original -24.77 
     2 1 B   Original -24.77 
     3 2 A   Original -409.33 
     4 2 B   Original -409.33 
     5 2 C   Original -409.33 
     6 2 D   Original -409.33 
     7 3 A   Original -843.11 
     8 3 A   Rebill  279.5 
     9 3 B   Original -843.11 
     10 4 A   Rebill  279.5 
     11 4 B   Original -843.11 
     12 5 B   Rebill  279.5 

Wie kann ich diesen df filtere, in einer Art und Weise nur die Linien, wo Rechnung/Rev_stream Combo sowohl Original und rebill Art von Net_rev hat. Im obigen Beispiel wären es nur Zeilen mit Index 7 und 8.

Gibt es eine einfache Möglichkeit, dies zu tun, ohne über den gesamten Datenrahmen zu iterieren und Wörterbücher für Rechnung + RevStream zu erstellen: Bill_type?

Was ich suche, ist eine Art von

df = df[df[['inv','Rev_stream']]['Bill_type'].unique().len() == 2] 

Leider oben wird der Code nicht funktioniert.

Vielen Dank im Voraus.

Antwort

2

können Sie gruppieren Sie erhobenen Daten durch inv und Rev_stream Spalten und dann für jede Gruppe überprüfen, ob beide Original und Rebill in den Bill_type Werte und Filter basierend auf dem Zustand sind:

(df.groupby(['inv', 'Rev_stream']) 
    .filter(lambda g: 'Original' in g.Bill_type.values and 'Rebill' in g.Bill_type.values)) 

enter image description here

+0

Vielen Dank ! Es dauert eine Weile für meine durchschnittlichen Datensätze (etwa 500k Zeilen), aber es funktioniert wie ein Charme! – Greg

Verwandte Themen