Come eliminare l'ultima riga di dati di un dataframe Panda


104

Penso che dovrebbe essere semplice, ma ho provato alcune idee e nessuna ha funzionato:

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

Ho provato a utilizzare indici negativi ma anche questo porta a errori. Devo ancora fraintendere qualcosa di fondamentale.


27
DF = DF[:-1]?
U2EF1

@ U2EF1 questo copia l'intero set di dati, non è vero? Quando si gestiscono dati enormi, questo potrebbe essere un problema.
ManuelSchneid3r

Risposte:


163

Per eliminare le ultime n righe:

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

Allo stesso modo, puoi eliminare le prime n righe:

df.drop(df.head(n).index,inplace=True) # drop first n rows

Per eliminare l'ultima colonna puoi usare df.drop (df.columns [-1], axis = 1, inplace = True) oppure, se conosci il nome della colonna puoi usare df.drop (columns = ['col_name '], inplace = True) - se non vuoi che venga eseguito sul posto, assegnalo a una nuova variabile e rimuovi quell'argomento.
Shawn Schreier il

78
DF[:-n]

dove n è l'ultimo numero di righe da eliminare.

Per eliminare l'ultima riga:

DF = DF[:-1]

58

Poiché il posizionamento dell'indice in Python è basato su 0, non ci sarà effettivamente un elemento nella indexposizione corrispondente a len(DF). Hai bisogno che sia 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]

Tuttavia, è molto più semplice scrivere DF[:-1].


2
Si noti che quando si rilascia utilizzando dfrm.index, l'indice dell'ultima riga dovrebbe essere univoco, altrimenti tutte le righe con quell'indice vengono eliminate.
FranciscoD

Capisco correttamente che usando drop (inplace = True) modifichi il df esistente, mentre usando df [: - 1] ottieni una visualizzazione dei dati, che in seguito può portare a SettingWithCopyWarning?
Philipp

21

Nessuno ha sollevato questo problema:

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

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

L'esecuzione di un test di velocità su un DataFrame di 1000 righe mostra che l'affettatura e head/ tailsono ~ 6 volte più veloci rispetto all'utilizzo di 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)

Forse la differenza tra i due approcci è quella head()e tail()creare una vista mentre in drop()realtà cambia la rappresentazione in memoria (o modifica sul posto o crea un dataframe completamente nuovo). Non ho cercato nei documenti, qualcuno per favore lo faccia. (se questa è la differenza: buona spiegazione per le differenze perf, e bisogna scegliere con cura tra loro) /
Dr. Jan-Philip Gehrcke

@ Dr.Jan-PhilipGehrcke Head head, taile droptutti restituiscono una vista, anche se è vero che dropti dà la possibilità di modificare il dataframe originale al suo posto.
theGirrafish

5
stats = pd.read_csv("C:\\py\\programs\\second pandas\\ex.csv")

L'output delle statistiche:

       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

basta usare skipfooter=1

skipfooter: int, predefinito 0

Numero di righe in fondo al file da saltare

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

Output di 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

1

drop restituisce un nuovo array quindi è per questo che è stato soffocato nel post og; Avevo un requisito simile per rinominare alcune intestazioni di colonna e cancellare alcune righe a causa di un file CSV mal formato convertito in Dataframe, quindi dopo aver letto questo post ho usato:

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)

e ha funzionato benissimo, come puoi vedere con le due righe commentate sopra ho provato il metodo drop. () e funziona ma non così kool e leggibile come usando [n: -n], spero che aiuti qualcuno, grazie.


0

Per i DataFrame più complessi che hanno un Multi-Index (ad esempio "Stock" e "Date") e si desidera rimuovere l'ultima riga per ogni Stock e non solo l'ultima riga dell'ultimo Stock, la soluzione è:

# 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)

Dato che groupby()sta aggiungendo un livello aggiuntivo al Multi-Index, alla fine lo rilasciamo semplicemente usando reset_index(). Il df risultante mantiene lo stesso tipo di Multi-Index di prima dell'operazione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.