Come eliminare un elenco di righe dal frame di dati Pandas?


258

Ho un dataframe 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

Quindi voglio eliminare le righe con determinati numeri di sequenza indicati in un elenco, supponiamo che qui [1,2,4],rimanga:

                  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

Come o quale funzione può farlo?


solo per chiarire, questa domanda riguarda il rilascio di righe con valori di indice specifici .. il loro uso di [1,2,4] è di indicare le righe rimaste dopo il rilascio. Di seguito ci sono le risposte che fanno questo.
alchimia

Risposte:


386

Utilizzare DataFrame.drop e passargli una serie di etichette indice:

In [65]: df
Out[65]: 
       one  two
one      1    4
two      2    3
three    3    2
four     4    1


In [66]: df.drop(df.index[[1,3]])
Out[66]: 
       one  two
one      1    4
three    3    2

18
+1 Inoltre, Eliminare l'ultima riga df.drop (df.tail (1) .index)
Nasser Al-Wohaibi,

15
Questa risposta funziona solo se df.index.unique () è uguale a df.index, che non è un requisito per un Pandas DataFrame. Qualcuno ha una soluzione quando i valori di df.index non sono garantiti come unici?
J Jones,

2
questo non ti consente di indicizzare il nome dell'indice stesso
ingrid

45
Gente, ad esempio, se vuoi essere chiaro, ti preghiamo di non usare le stesse stringhe per righe e colonne. Va bene per coloro che conoscono già veramente le loro cose. Frustrante per coloro che cercano di imparare.
gseattle

2
nuovi arrivati ​​su Python: nota che se vuoi eliminare queste righe e salvarle nello stesso frame di dati (interno) devi anche aggiungere axis=0(0 = righe, 1 = colonne) e inplace=Truecome in df.drop(df.index[[1,3]], axis=0, inplace=True). @mezzanaccio, se sai specificamente quali indici vuoi sostituire (e anche usando il tuo esempio da 0 a n):df.drop(df.index[range(0, n)], axis=0, inplace=True)
mrbTT


47

Se DataFrame è enorme e anche il numero di righe da eliminare è elevato, la semplice selezione per indice df.drop(df.index[])richiede troppo tempo.

Nel mio caso, ho un DataFrame multi-indicizzato di float con 100M rows x 3 colse devo rimuovere le 10krighe da esso. Il metodo più veloce che ho trovato è, abbastanza controintuitivamente, per takele righe rimanenti.

Lascia che indexes_to_dropsia una matrice di indici posizionali da eliminare ( [1, 2, 4]nella domanda).

indexes_to_keep = set(range(df.shape[0])) - set(indexes_to_drop)
df_sliced = df.take(list(indexes_to_keep))

Nel mio caso ciò ha richiesto 20.5s, mentre il semplice ha df.droppreso 5min 27se consumato molta memoria. Il DataFrame risultante è lo stesso.


43

Puoi anche passare a DataFrame.drop l' etichetta stessa (anziché Serie di etichette di indice):

In[17]: df
Out[17]: 
            a         b         c         d         e
one  0.456558 -2.536432  0.216279 -1.305855 -0.121635
two -1.015127 -0.445133  1.867681  2.179392  0.518801

In[18]: df.drop('one')
Out[18]: 
            a         b         c         d         e
two -1.015127 -0.445133  1.867681  2.179392  0.518801

Che equivale a:

In[19]: df.drop(df.index[[0]])
Out[19]: 
            a         b         c         d         e
two -1.015127 -0.445133  1.867681  2.179392  0.518801

1
df.drop (df.index [0]) funziona anche. voglio dire, non c'è bisogno di double square_brackets (con i panda 0.18.1, almeno)
tagoma

23

Ho risolto questo in un modo più semplice - solo in 2 passaggi.

Passaggio 1: innanzitutto formare un frame di dati con righe / dati indesiderati.

Passaggio 2: utilizzare l'indice di questo frame di dati indesiderato per eliminare le righe dal frame di dati originale.

Esempio:

Supponiamo di avere un dataframe df che contenga quante colonne includa 'Age' che è un numero intero. Ora supponiamo che tu voglia eliminare tutte le righe con 'Età' come numero negativo.

Passaggio 1: df_age_negative = df [df ['Age'] <0]

Passaggio 2: df = df.drop (df_age_negative.index, axis = 0)

Spero che questo sia molto più semplice e ti aiuti.


1
+1, questa è l'unica risposta che ti dice come rimuovere una riga selezionando una colonna diversa dalla prima.
Alejo Bernardin,

10

Se voglio eliminare una riga con l'indice x, diciamo :

df = df[df.index != x]

Se desidero eliminare più indici (supponiamo che questi indici siano nell'elenco unwanted_indices), farei:

desired_indices = [i for i in len(df.index) if i not in unwanted_indices]
desired_df = df.iloc[desired_indices]

6

Ecco un esempio un po 'specifico, vorrei mostrarlo. Supponi di avere molte voci duplicate in alcune delle tue righe. Se si dispone di voci stringa, è possibile utilizzare facilmente i metodi stringa per trovare tutti gli indici da eliminare.

ind_drop = df[df['column_of_strings'].apply(lambda x: x.startswith('Keyword'))].index

E ora rilasciare quelle righe usando i loro indici

new_df = df.drop(ind_drop)

3

In un commento alla risposta di @ theodros-zelleke, @ j-jones ha chiesto cosa fare se l'indice non è unico. Ho dovuto affrontare una situazione del genere. Quello che ho fatto è stato rinominare i duplicati nell'indice prima di chiamare drop(), alla:

dropped_indexes = <determine-indexes-to-drop>
df.index = rename_duplicates(df.index)
df.drop(df.index[dropped_indexes], inplace=True)

dove rename_duplicates()è una funzione che ho definito che ha attraversato gli elementi dell'indice e rinominato i duplicati. Ho usato lo stesso modello di ridenominazione pd.read_csv()utilizzato nelle colonne, ovvero "%s.%d" % (name, count)dove si nametrova il nome della riga ed countè quante volte si è verificato in precedenza.


1

Determinazione dell'indice dal valore booleano come sopra descritto ad es

df[df['column'].isin(values)].index

può richiedere più memoria rispetto alla determinazione dell'indice utilizzando questo metodo

pd.Index(np.where(df['column'].isin(values))[0])

applicato in questo modo

df.drop(pd.Index(np.where(df['column'].isin(values))[0]), inplace = True)

Questo metodo è utile quando si hanno a che fare con frame di dati di grandi dimensioni e memoria limitata.


0

Utilizzare solo l'argomento Index per eliminare la riga: -

df.drop(index = 2, inplace = True)

Per più file: -

df.drop(index=[1,3], inplace = True)

0

Prendi in considerazione un esempio di frame di dati

df =     
index    column1
0           00
1           10
2           20
3           30

vogliamo eliminare la seconda e la terza riga dell'indice.

Approccio 1:

df = df.drop(df.index[2,3])
 or 
df.drop(df.index[2,3],inplace=True)
print(df)

df =     
index    column1
0           00
3           30

 #This approach removes the rows as we wanted but the index remains unordered

Approccio 2

df.drop(df.index[2,3],inplace=True,ignore_index=True)
print(df)
df =     
index    column1
0           00
1           30
#This approach removes the rows as we wanted and resets the index. 
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.