2013-05-23 16 views
10

Ich bin Python 2.7 ausgeführt mit der Pandas 0.11.0 Bibliothek installiert.Python Pandas - Entfernen von Zeilen aus einem DataFrame basierend auf einem zuvor erhaltenen Subset

Ich habe mich umgesehen und habe keine Antwort auf diese Frage gefunden, also hoffe ich, dass jemand erfahrener als ich eine Lösung hat.

Lässt meine Daten sagen, in df1, sieht wie folgt aus:

df1=

zip x y access 
    123 1 1 4 
    123 1 1 6 
    133 1 2 3 
    145 2 2 3 
    167 3 1 1 
    167 3 1 2 

Verwendung, zum Beispiel, df2 = df1[df1['zip'] == 123] und dann df2 = df2.join(df1[df1['zip'] == 133]) erhalte ich die folgende Teilmenge der Daten:

zip x y access 
123 1 1 4 
123 1 1 6 
133 1 2 3 

Was ich tun möchte, ist entweder:

1) Entfernen Sie die Zeilen aus df1 wie sie definiert sind/verbunden mit df2

OR

2) Nach df2 erstellt wurde, entfernen Sie die Zeilen (Unterschied?) von df1 die df2 besteht aus

Hoffnung, all das macht Sinn. Bitte lassen Sie mich wissen, wenn weitere Informationen benötigt werden.

EDIT:

Im Idealfall eine dritte Datenrahmen wäre zu schaffen, dass wie folgt aussieht:

df2=

zip x y access 
145 2 2 3 
167 3 1 1 
167 3 1 2 

Das heißt, alles von df1 nicht in df2. Vielen Dank!

+0

Ich bin mir nicht sicher, welche Ausgabe Sie wollen. Möchten Sie den Datenrahmen nur in zwei neue Datenrahmen aufteilen, von denen einer aus Zeilen besteht, in denen die 'zip'-Spalte 123 oder 133 ist und einer aus dem Rest besteht? – DSM

+0

@DSM Ich habe die Frage bearbeitet - was ich suche ist unten. Vielen Dank! – DMML

Antwort

23

Zwei Optionen kommen in den Sinn. Verwenden Sie zuerst isin und eine Maske:

>>> df 
    zip x y access 
0 123 1 1  4 
1 123 1 1  6 
2 133 1 2  3 
3 145 2 2  3 
4 167 3 1  1 
5 167 3 1  2 
>>> keep = [123, 133] 
>>> df_yes = df[df['zip'].isin(keep)] 
>>> df_no = df[~df['zip'].isin(keep)] 
>>> df_yes 
    zip x y access 
0 123 1 1  4 
1 123 1 1  6 
2 133 1 2  3 
>>> df_no 
    zip x y access 
3 145 2 2  3 
4 167 3 1  1 
5 167 3 1  2 

Zweitens verwenden groupby:

>>> grouped = df.groupby(df['zip'].isin(keep)) 

und dann jede von

>>> grouped.get_group(True) 
    zip x y access 
0 123 1 1  4 
1 123 1 1  6 
2 133 1 2  3 
>>> grouped.get_group(False) 
    zip x y access 
3 145 2 2  3 
4 167 3 1  1 
5 167 3 1  2 
>>> [g for k,g in list(grouped)] 
[ zip x y access 
3 145 2 2  3 
4 167 3 1  1 
5 167 3 1  2, zip x y access 
0 123 1 1  4 
1 123 1 1  6 
2 133 1 2  3] 
>>> dict(list(grouped)) 
{False: zip x y access 
3 145 2 2  3 
4 167 3 1  1 
5 167 3 1  2, True: zip x y access 
0 123 1 1  4 
1 123 1 1  6 
2 133 1 2  3} 
>>> dict(list(grouped)).values() 
[ zip x y access 
3 145 2 2  3 
4 167 3 1  1 
5 167 3 1  2, zip x y access 
0 123 1 1  4 
1 123 1 1  6 
2 133 1 2  3] 

Welche am sinnvollsten ist, hängt von dem Kontext, aber ich denke, Du hast die Idee.

+0

Vielen Dank! – DMML

Verwandte Themen