Skip to content

pandas: Cancellare righe e colonne da DataFrame con drop()

Python

Usa drop() per eliminare righe e colonne da pandas.DataFrame.

Prima della versione 0.21.0, specifica la riga/colonna con le etichette dei parametri e l’asse. indice o colonne possono essere utilizzati da 0.21.0.

Questo articolo ha descritto i seguenti contenuti.

  • Elimina le righe da pandas.DataFrame
    • Specificare per nome riga (etichetta riga)
    • Specificare per numero di riga
    • Nota quando l’indice non è impostato
  • Elimina colonne da panda.DataFrame
    • Specifica per nome colonna (etichetta colonna)
    • Specificare per numero di colonna
  • Elimina più righe e colonne contemporaneamente

Vedere i seguenti articoli sulla rimozione dei valori mancanti NaN e delle righe con elementi duplicati.

Il codice di esempio utilizza i dati seguenti.

import pandas as pd

df = pd.read_csv('data/src/sample_pandas_normal.csv', index_col=0)
print(df)
#          age state  point
# name                     
# Alice     24    NY     64
# Bob       42    CA     92
# Charlie   18    CA     70
# Dave      68    TX     70
# Ellen     24    CA     88
# Frank     30    NY     57

Il file CSV è qui:

Elimina le righe da pandas.DataFrame

Specificare per nome riga (etichetta riga)

Specificando con le prime etichette dei parametri e il secondo asse dei parametri. Nel caso di righe, impostare asse=0.

print(df.drop('Charlie', axis=0))
#        age state  point
# name                   
# Alice   24    NY     64
# Bob     42    CA     92
# Dave    68    TX     70
# Ellen   24    CA     88
# Frank   30    NY     57

Il valore predefinito è asse=0, quindi l’asse può essere omesso.

print(df.drop('Charlie'))
#        age state  point
# name                   
# Alice   24    NY     64
# Bob     42    CA     92
# Dave    68    TX     70
# Ellen   24    CA     88
# Frank   30    NY     57

Dalla versione 0.21.0 è possibile utilizzare anche l’indice dei parametri.

print(df.drop(index='Charlie'))
#        age state  point
# name                   
# Alice   24    NY     64
# Bob     42    CA     92
# Dave    68    TX     70
# Ellen   24    CA     88
# Frank   30    NY     57

Utilizzare un elenco per eliminare più righe contemporaneamente.

print(df.drop(['Bob', 'Dave', 'Frank']))
#          age state  point
# name                     
# Alice     24    NY     64
# Charlie   18    CA     70
# Ellen     24    CA     88

print(df.drop(index=['Bob', 'Dave', 'Frank']))
#          age state  point
# name                     
# Alice     24    NY     64
# Charlie   18    CA     70
# Ellen     24    CA     88

Per configurazione predefinita, il DataFrame originale non viene modificato e viene restituito un nuovo DataFrame.

L’impostazione del parametro inplace su True cambia il DataFrame originale. In questo caso, non viene restituito alcun nuovo DataFrame e il valore restituito è None.

df_org = df.copy()
df_org.drop(index=['Bob', 'Dave', 'Frank'], inplace=True)
print(df_org)
#          age state  point
# name                     
# Alice     24    NY     64
# Charlie   18    CA     70
# Ellen     24    CA     88

Specificare per numero di riga

Se si desidera specificare in base al numero di riga, utilizzare l’attributo index di DataFrame.

Specificare il numero di riga in [] dell’attributo index per ottenere il nome della riga corrispondente. È possibile specificare più numeri di riga utilizzando un elenco.

print(df.index[[1, 3, 5]])
# Index(['Bob', 'Dave', 'Frank'], dtype="object", name="name")

Puoi specificare questo come il primo parametro label o index of drop().

print(df.drop(df.index[[1, 3, 5]]))
#          age state  point
# name                     
# Alice     24    NY     64
# Charlie   18    CA     70
# Ellen     24    CA     88

print(df.drop(index=df.index[[1, 3, 5]]))
#          age state  point
# name                     
# Alice     24    NY     64
# Charlie   18    CA     70
# Ellen     24    CA     88

Nota quando l’indice non è impostato

Se non viene impostato alcun nome di riga, per la configurazione predefinita index sarà una sequenza di numeri interi. Fai attenzione se index è un numero anziché una stringa.

df_noindex = pd.read_csv('data/src/sample_pandas_normal.csv')
print(df_noindex)
#       name  age state  point
# 0    Alice   24    NY     64
# 1      Bob   42    CA     92
# 2  Charlie   18    CA     70
# 3     Dave   68    TX     70
# 4    Ellen   24    CA     88
# 5    Frank   30    NY     57

print(df_noindex.index)
# RangeIndex(start=0, stop=6, step=1)

Finché si tratta di un numero sequenziale, il risultato è lo stesso sia che si specifichi un numero così com’è sia che si utilizzi l’attributo index.

print(df_noindex.drop([1, 3, 5]))
#       name  age state  point
# 0    Alice   24    NY     64
# 2  Charlie   18    CA     70
# 4    Ellen   24    CA     88

print(df_noindex.drop(df_noindex.index[[1, 3, 5]]))
#       name  age state  point
# 0    Alice   24    NY     64
# 2  Charlie   18    CA     70
# 4    Ellen   24    CA     88

Il risultato è diverso se è fuori sequenza per ordinamento, ecc. Quando si specifica un valore numerico così com’è, la riga la cui etichetta è il valore numerico viene eliminato e quando si utilizza l’attributo indice, la riga il cui numero è il valore numerico viene cancellato.

df_noindex_sort = df_noindex.sort_values('state')
print(df_noindex_sort)
#       name  age state  point
# 1      Bob   42    CA     92
# 2  Charlie   18    CA     70
# 4    Ellen   24    CA     88
# 0    Alice   24    NY     64
# 5    Frank   30    NY     57
# 3     Dave   68    TX     70

print(df_noindex_sort.index)
# Int64Index([1, 2, 4, 0, 5, 3], dtype="int64")

print(df_noindex_sort.drop([1, 3, 5]))
#       name  age state  point
# 2  Charlie   18    CA     70
# 4    Ellen   24    CA     88
# 0    Alice   24    NY     64

print(df_noindex_sort.drop(df_noindex_sort.index[[1, 3, 5]]))
#     name  age state  point
# 1    Bob   42    CA     92
# 4  Ellen   24    CA     88
# 5  Frank   30    NY     57

Vedere il seguente articolo per l’ordinamento.

Elimina colonne da panda.DataFrame

Specifica per nome colonna (etichetta colonna)

Specificando con le prime etichette dei parametri e il secondo asse dei parametri. Nel caso di righe, impostare asse=1.

print(df.drop('state', axis=1))
#          age  point
# name               
# Alice     24     64
# Bob       42     92
# Charlie   18     70
# Dave      68     70
# Ellen     24     88
# Frank     30     57

A partire dalla versione 0.21.0, puoi anche utilizzare le colonne dei parametri.

print(df.drop(columns='state'))
#          age  point
# name               
# Alice     24     64
# Bob       42     92
# Charlie   18     70
# Dave      68     70
# Ellen     24     88
# Frank     30     57

Utilizzare un elenco per eliminare più colonne contemporaneamente.

print(df.drop(['state', 'point'], axis=1))
#          age
# name        
# Alice     24
# Bob       42
# Charlie   18
# Dave      68
# Ellen     24
# Frank     30

print(df.drop(columns=['state', 'point']))
#          age
# name        
# Alice     24
# Bob       42
# Charlie   18
# Dave      68
# Ellen     24
# Frank     30

Il parametro inplace può essere utilizzato anche per le righe.

df_org = df.copy()
df_org.drop(columns=['state', 'point'], inplace=True)
print(df_org)
#          age
# name        
# Alice     24
# Bob       42
# Charlie   18
# Dave      68
# Ellen     24
# Frank     30

Specificare per numero di colonna

Se si desidera specificare in base al numero di colonna, utilizzare l’attributo colonne di DataFrame.

print(df.columns[[1, 2]])
# Index(['state', 'point'], dtype="object")

print(df.drop(df.columns[[1, 2]], axis=1))
#          age
# name        
# Alice     24
# Bob       42
# Charlie   18
# Dave      68
# Ellen     24
# Frank     30

print(df.drop(columns=df.columns[[1, 2]]))
#          age
# name        
# Alice     24
# Bob       42
# Charlie   18
# Dave      68
# Ellen     24
# Frank     30

Se il valore delle colonne è un numero intero, fare attenzione come sopra le righe.

Elimina più righe e colonne contemporaneamente

Dalla versione 0.21.0 e successive, è possibile eliminare più righe e colonne contemporaneamente specificando l’indice dei parametri e le colonne.

Naturalmente, è anche possibile specificare per numero di riga e numero di colonna o specificare il parametro inplace.

print(df.drop(index=['Bob', 'Dave', 'Frank'],
              columns=['state', 'point']))
#          age
# name        
# Alice     24
# Charlie   18
# Ellen     24

print(df.drop(index=df.index[[1, 3, 5]],
              columns=df.columns[[1, 2]]))
#          age
# name        
# Alice     24
# Charlie   18
# Ellen     24

df_org = df.copy()
df_org.drop(index=['Bob', 'Dave', 'Frank'],
            columns=['state', 'point'], inplace=True)
print(df_org)
#          age
# name        
# Alice     24
# Charlie   18
# Ellen     24