2017-08-15 1 views
1

Ich habe eine Liste, to_delete, von Zeilenindizes, die ich aus beiden meiner beiden Pandas-Dataframes löschen möchte, df1 & df2. Sie haben beide 500 Reihen. to_delete hat 50 Einträge. Ich laufe dies:Versuch, mehrere Zeilen aus Pandas Dataframe zu löschen, aber mehr Zeilen als beabsichtigt gelöscht werden

df1.drop(df1.index[to_delete], inplace=True) 
df2.drop(df2.index[to_delete], inplace=True) 

Aber dies führt zu DF1 und DF2 jeweils 250 Zeilen aufweisen. Es löscht 250 Zeilen von jedem, und nicht die 50 bestimmten Zeilen, die ich möchte ...

to_delete ist in absteigender Reihenfolge angeordnet.

Die vollständige Methode:

def method(results): 
    #results is a 500 x 1 matrix of 1's and -1s 
    global df1, df2 
    deletions = [] 
    for i in xrange(len(results)-1, -1, -1): 
     if results[i] == -1: 
     deletions.append(i) 
    df1.drop(df1.index[deletions], inplace=True) 
    df2.drop(df2.index[deletions], inplace=True) 

Irgendwelche Vorschläge, was ich falsch mache?

(Ich habe auch versucht .iloc anstelle von .index und Löschen in der if statement anstatt zuerst auf eine Liste angehängt wird.

+0

Wenn Indizes von df nicht eindeutig ist (zB 'data = pd.DataFrame (np.arange (12) .reshape (4,3), Säulen = [ 'a', 'b', 'c' ], index = [1,1,2,3]) '), dann' data.drop (data.index [[1,2]], inplace = True) 'löscht drei Zeilen, auch wenn Sie bereits bestanden haben nur zwei zu löschende Indizes –

Antwort

1

Ihre Indexwerte nicht eindeutig zuzuordnen sind und wenn Sie drop es alle Zeilen mit denen das Entfernen Indexwerte. to_delete haben 50 der Länge gewesen, aber es gab 250 Zeilen, die diese bestimmten Indexwerte hatte.

Betrachten Sie das Beispiel

df = pd.DataFrame(dict(A=range(10)), [0, 1, 2, 3, 4] * 2) 

df 

    A 
0 0 
1 1 
2 2 
3 3 
4 4 
0 5 
1 6 
2 7 
3 8 
4 9 

Angenommen, Sie möchten die erste, dritte und vierte Zeile entfernen.

to_del = [0, 2, 3] 

Arbeiten mit dem Verfahren

df.drop(df.index[to_del]) 

    A 
1 1 
4 4 
1 6 
4 9 

was ein Problem ist


Option 1
Verwendung np.in1d zu Komplement to_del
Das ist selbsterklärend als th finden die anderen. Ich suche in einem Array von 0 bis n und sehen, ob es in to_del ist. Das Ergebnis ist ein boolesches Array mit der gleichen Länge wie df. Ich benutze ~, um die Negation zu bekommen und benutze das, um den Datenrahmen zu zerlegen.

df[~np.in1d(np.arange(len(df)), to_del)] 

    A 
1 1 
4 4 
0 5 
1 6 
2 7 
3 8 
4 9 

Option 2
Verwendung np.bincount Komplement to_del
zu finden in to_del Dies erreicht das Gleiche wie die Option 1, indem die Positionen definiert zählen. Ich am Ende mit einem Array von 0 und 1 mit einer 1 in jeder Position, die in to_del und 0 sonst wo definiert ist. Ich möchte die 0 s behalten, damit ich ein boolesches Array mache, indem ich finde, wo es gleich 0 ist. Ich benutze das dann, um den Datenrahmen zu schneiden.

df[np.bincount(to_del, minlength=len(df)) == 0] 

    A 
1 1 
4 4 
0 5 
1 6 
2 7 
3 8 
4 9 

Option 3
Verwendung np.setdiff1d Positionen zu finden
Dies verwendet Setlogik den Unterschied zwischen einer vollen Reihe von Positionen zu finden und nur die, die ich löschen möchten. Ich benutze dann iloc zur Auswahl.

df.iloc[np.setdiff1d(np.arange(len(df)), to_del)] 

    A 
1 1 
4 4 
0 5 
1 6 
2 7 
3 8 
4 9 
+0

Danke, Ihre Vorschläge haben funktioniert! Ging mit Option 2, aber ich verstehe nicht, was es eigentlich macht. Könnten Sie bitte erklären? Auch nur aus Neugier; Ich habe pd.read_csv verwendet, um meine Daten zu erhalten. Wie sind die Indizes nicht eindeutig? Ich habe sie nie auf etwas gesetzt, ich habe einfach angenommen, dass der Index im Grunde nur die Zeilennummer ist? (Entschuldigung, ich bin neu bei Python (~ 3 Wochen)). – MahDhan

+0

Ich habe einige Kommentare hinzugefügt. Ich hoffe, das hilft. – piRSquared

+0

@MahDhan in Bezug auf die Index-Einzigartigkeit. Nur so kann ich mir vorstellen, wie deine Situation sein kann. Wenn Sie einen CSV lesen, können Sie einen Teil der Datei als Index verwenden. Es ist möglicherweise nicht einzigartig. Auch wenn Sie Fragen stellen. Wir bevorzugen es, wenn Sie ein Beispiel dafür nennen, was das Problem verursacht. Auf diese Weise beseitigen wir Mehrdeutigkeiten und machen es leichter, Sie für alle Beteiligten leichter zu bekommen. – piRSquared

Verwandte Themen