Ich habe einen Datenrahmen df:
>>> df
sales discount net_sales cogs
STK_ID RPT_Date
600141 20060331 2.709 NaN 2.709 2.245
20060630 6.590 NaN 6.590 5.291
20060930 10.103 NaN 10.103 7.981
20061231 15.915 NaN 15.915 12.686
20070331 3.196 NaN 3.196 2.710
20070630 7.907 NaN 7.907 6.459
Dann möchte ich Zeilen mit bestimmten Folgenummern löschen, die in einer Liste angegeben sind. Angenommen, hier bleibt [1,2,4],
dann Folgendes übrig:
sales discount net_sales cogs
STK_ID RPT_Date
600141 20060331 2.709 NaN 2.709 2.245
20061231 15.915 NaN 15.915 12.686
20070630 7.907 NaN 7.907 6.459
Wie oder welche Funktion kann das?
Antworten:
Verwenden Sie DataFrame.drop und übergeben Sie ihm eine Reihe von Indexbezeichnungen :
quelle
axis=0
Zeilen (0 = Zeilen, 1 = Spalten) undinplace=True
wie in hinzufügen müssendf.drop(df.index[[1,3]], axis=0, inplace=True)
. @mezzanaccio, wenn Sie genau wissen, welche Indizes Sie ersetzen möchten (und auch Ihr 0 bis n Beispiel verwenden):df.drop(df.index[range(0, n)], axis=0, inplace=True)
Beachten Sie, dass es möglicherweise wichtig ist, den Befehl "inplace" zu verwenden, wenn Sie die Zeile einfügen möchten.
Da Ihre ursprüngliche Frage nichts zurückgibt, sollte dieser Befehl verwendet werden. http://pandas.pydata.org/pandas-docs/version/0.17.0/generated/pandas.DataFrame.drop.html
quelle
Wenn der DataFrame sehr groß ist und auch die Anzahl der zu löschenden Zeilen groß ist,
df.drop(df.index[])
dauert das einfache Löschen nach Index zu lange.In meinem Fall habe ich einen mehrfach indizierten DataFrame von Floats mit
100M rows x 3 cols
und muss10k
Zeilen daraus entfernen . Die schnellste Methode, die ich gefunden habe, ist ziemlich intuitiv zutake
den verbleibenden Zeilen.Sei
indexes_to_drop
ein Array von Positionsindizes, die gelöscht werden sollen ([1, 2, 4]
in der Frage).In meinem Fall dauerte dies
20.5s
, während das Einfache viel Speicherdf.drop
nahm5min 27s
und verbrauchte. Der resultierende DataFrame ist der gleiche.quelle
Sie können auch das Label selbst an DataFrame.drop übergeben (anstelle von Serien von Index-Labels):
Welches ist gleichbedeutend mit:
quelle
Ich habe das auf einfachere Weise gelöst - nur in 2 Schritten.
Schritt 1: Bilden Sie zuerst einen Datenrahmen mit unerwünschten Zeilen / Daten.
Schritt 2: Verwenden Sie den Index dieses unerwünschten Datenrahmens, um die Zeilen aus dem ursprünglichen Datenrahmen zu löschen.
Beispiel:
Angenommen, Sie haben einen Datenrahmen df, der so viele Spalten enthält, einschließlich 'Age', das eine Ganzzahl ist. Angenommen, Sie möchten alle Zeilen mit 'Alter' als negativer Zahl löschen.
Schritt 1: df_age_negative = df [df ['Alter'] <0]
Schritt 2: df = df.drop (df_age_negative.index, axis = 0)
Hoffe das ist viel einfacher und hilft dir.
quelle
Wenn ich eine Zeile löschen möchte, die beispielsweise einen Index enthält
x
, würde ich Folgendes tun:Wenn ich mehrere Indizes löschen möchte (sagen wir, diese Indizes sind in der Liste enthalten
unwanted_indices
), würde ich Folgendes tun:quelle
Hier ist ein etwas spezifisches Beispiel, das ich zeigen möchte. Angenommen, Sie haben viele doppelte Einträge in einigen Ihrer Zeilen. Wenn Sie Zeichenfolgeneinträge haben, können Sie problemlos Zeichenfolgenmethoden verwenden, um alle zu löschenden Indizes zu finden.
Und jetzt diese Zeilen mit ihren Indizes löschen
quelle
In einem Kommentar zur Antwort von @ theodros-zelleke fragte @ j-jones, was zu tun sei, wenn der Index nicht eindeutig sei. Ich musste mich mit einer solchen Situation auseinandersetzen. Was ich getan habe, war, die Duplikate im Index umzubenennen, bevor ich aufgerufen habe
drop()
, a la:Wo
rename_duplicates()
ist eine von mir definierte Funktion, die die Elemente des Index durchlief und die Duplikate umbenannte? Ich habe das gleiche Umbenennungsmusterpd.read_csv()
verwendet wie für Spalten, dh"%s.%d" % (name, count)
woname
ist der Name der Zeile undcount
wie oft sie zuvor aufgetreten ist.quelle
Bestimmen des Index aus dem Booleschen Wert wie oben beschrieben, z
kann speicherintensiver sein als das Bestimmen des Index mit dieser Methode
so angewendet
Diese Methode ist nützlich, wenn Sie mit großen Datenrahmen und begrenztem Speicher arbeiten.
quelle
Verwenden Sie nur das Index-Argument, um die Zeile zu löschen: -
Für mehrere Zeilen: -
quelle
Betrachten Sie einen beispielhaften Datenrahmen
Wir wollen die 2. und 3. Indexzeile löschen.
Ansatz 1:
Ansatz 2
quelle