So löschen Sie die letzte Datenzeile eines Pandas-Datenrahmens

101

Ich denke, das sollte einfach sein, aber ich habe ein paar Ideen ausprobiert und keine davon hat funktioniert:

last_row = len(DF)
DF = DF.drop(DF.index[last_row])  #<-- fail!

Ich habe versucht, negative Indizes zu verwenden, aber das führte auch zu Fehlern. Ich muss immer noch etwas Grundlegendes falsch verstehen.

tumultous_rooster
quelle
27
DF = DF[:-1]?
U2EF1
@ U2EF1 dies kopiert den gesamten Datensatz, nicht wahr? Beim Umgang mit großen Datenmengen kann dies ein Problem sein.
ManuelSchneid3r

Antworten:

161

So löschen Sie die letzten n Zeilen:

df.drop(df.tail(n).index,inplace=True) # drop last n rows

Auf die gleiche Weise können Sie die ersten n Zeilen löschen:

df.drop(df.head(n).index,inplace=True) # drop first n rows
Kane Chew
quelle
Um die letzte Spalte zu löschen, können Sie df.drop (df.columns [-1], axis = 1, inplace = True) oder, wenn Sie den Namen der Spalte kennen, df.drop (column = ['col_name) verwenden '], inplace = True) - Wenn Sie nicht möchten, dass es an Ort und Stelle ausgeführt wird, weisen Sie es einer neuen Variablen zu und entfernen Sie dieses Argument.
Shawn Schreier
78
DF[:-n]

Dabei ist n die letzte Anzahl von Zeilen, die gelöscht werden sollen.

So löschen Sie die letzte Zeile:

DF = DF[:-1]
blauer Himmel
quelle
58

Da die Indexpositionierung in Python auf 0 basiert, befindet sich indexan der entsprechenden Stelle kein Element len(DF). Das muss sein last_row = len(DF) - 1:

In [49]: dfrm
Out[49]: 
          A         B         C
0  0.120064  0.785538  0.465853
1  0.431655  0.436866  0.640136
2  0.445904  0.311565  0.934073
3  0.981609  0.695210  0.911697
4  0.008632  0.629269  0.226454
5  0.577577  0.467475  0.510031
6  0.580909  0.232846  0.271254
7  0.696596  0.362825  0.556433
8  0.738912  0.932779  0.029723
9  0.834706  0.002989  0.333436

[10 rows x 3 columns]

In [50]: dfrm.drop(dfrm.index[len(dfrm)-1])
Out[50]: 
          A         B         C
0  0.120064  0.785538  0.465853
1  0.431655  0.436866  0.640136
2  0.445904  0.311565  0.934073
3  0.981609  0.695210  0.911697
4  0.008632  0.629269  0.226454
5  0.577577  0.467475  0.510031
6  0.580909  0.232846  0.271254
7  0.696596  0.362825  0.556433
8  0.738912  0.932779  0.029723

[9 rows x 3 columns]

Es ist jedoch viel einfacher, nur zu schreiben DF[:-1].

ely
quelle
2
Beachten Sie, dass beim Löschen mit dfrm.index der Index der letzten Zeile eindeutig sein sollte, da sonst alle Zeilen mit diesem Index gelöscht werden.
FranciscoD
Verstehe ich richtig, dass Sie mit drop (inplace = True) die vorhandene df ändern, während Sie mit df [: - 1] eine Ansicht der Daten erhalten, die später zu SettingWithCopyWarning führen kann?
Philipp
19

Überrascht brachte niemand dieses Thema zur Sprache:

# To remove last n rows
df.head(-n)

# To remove first n rows
df.tail(-n)

Das Ausführen eines Geschwindigkeitstests auf einem DataFrame mit 1000 Zeilen zeigt, dass das Schneiden und head/ tailoder ~ 6-mal schneller ist als die Verwendung von drop:

>>> %timeit df[:-1]
125 µs ± 132 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

>>> %timeit df.head(-1)
129 µs ± 1.18 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

>>> %timeit df.drop(df.tail(1).index)
751 µs ± 20.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
theGirrafish
quelle
Vielleicht nähert sich der Unterschied zwischen den beiden ist , dass head()und tail()eine schaffen Ansicht während drop()tatsächlich Repräsentation im Speicher ändert (entweder inplace Modifikation oder erstellt eine völlig neue Datenrahmen). Ich habe das nicht in Dokumenten nachgeschlagen, bitte jemand. (Wenn das der Unterschied ist: gute Erklärung für Perf Diff, und man muss sorgfältig zwischen ihnen wählen) /
Dr. Jan-Philip Gehrcke
@ Dr.Jan-PhilipGehrcke Head head, tailund dropalle geben eine Ansicht zurück, obwohl es wahr ist, dass dropSie die Option haben, den ursprünglichen Datenrahmen an Ort und Stelle zu ändern.
theGirrafish
5
stats = pd.read_csv("C:\\py\\programs\\second pandas\\ex.csv")

Die Ausgabe von Statistiken:

       A            B          C
0   0.120064    0.785538    0.465853
1   0.431655    0.436866    0.640136
2   0.445904    0.311565    0.934073
3   0.981609    0.695210    0.911697
4   0.008632    0.629269    0.226454
5   0.577577    0.467475    0.510031
6   0.580909    0.232846    0.271254
7   0.696596    0.362825    0.556433
8   0.738912    0.932779    0.029723
9   0.834706    0.002989    0.333436

benutz einfach skipfooter=1

skipfooter: int, Standard 0

Anzahl der zu überspringenden Zeilen am Ende der Datei

stats_2 = pd.read_csv("C:\\py\\programs\\second pandas\\ex.csv", skipfooter=1, engine='python')

Ausgabe von stats_2

       A          B            C
0   0.120064    0.785538    0.465853
1   0.431655    0.436866    0.640136
2   0.445904    0.311565    0.934073
3   0.981609    0.695210    0.911697
4   0.008632    0.629269    0.226454
5   0.577577    0.467475    0.510031
6   0.580909    0.232846    0.271254
7   0.696596    0.362825    0.556433
8   0.738912    0.932779    0.029723
Riz.Khan
quelle
1

drop gibt ein neues Array zurück, weshalb es im og-Post erstickt ist. Ich hatte eine ähnliche Anforderung, einige Spaltenüberschriften umzubenennen und einige Zeilen aufgrund einer schlecht geformten CSV-Datei zu löschen, die in Dataframe konvertiert wurde. Nachdem ich diesen Beitrag gelesen hatte, verwendete ich:

newList = pd.DataFrame(newList)
newList.columns = ['Area', 'Price']
print(newList)
# newList = newList.drop(0)
# newList = newList.drop(len(newList))
newList = newList[1:-1]
print(newList)

und es hat großartig funktioniert, wie Sie an den beiden auskommentierten Zeilen oben sehen können. Ich habe die drop. () -Methode ausprobiert und sie funktioniert, ist aber nicht so cool und lesbar wie die Verwendung von [n: -n]. Ich hoffe, das hilft jemandem, danke.

PrimeTime
quelle
0

Bei komplexeren DataFrames mit einem Multi-Index (z. B. "Stock" und "Date"), bei denen die letzte Zeile für jeden Stock entfernt werden soll, nicht nur die letzte Zeile des letzten Stocks, lautet die Lösung:

# To remove last n rows
df = df.groupby(level='Stock').apply(lambda x: x.head(-1)).reset_index(0, drop=True)

# To remove first n rows
df = df.groupby(level='Stock').apply(lambda x: x.tail(-1)).reset_index(0, drop=True)

Da der groupby()Multi-Index um eine zusätzliche Ebene erweitert wird, lassen wir ihn am Ende einfach mit fallen reset_index(). Der resultierende df behält den gleichen Typ von Multi-Index wie vor der Operation bei.

Dorian B.
quelle