Comprendo che per eliminare una colonna si utilizza df.drop ('nome colonna', asse = 1). Esiste un modo per eliminare una colonna utilizzando un indice numerico anziché il nome della colonna?
Comprendo che per eliminare una colonna si utilizza df.drop ('nome colonna', asse = 1). Esiste un modo per eliminare una colonna utilizzando un indice numerico anziché il nome della colonna?
Risposte:
Puoi eliminare la colonna i
sull'indice in questo modo:
df.drop(df.columns[i], axis=1)
Potrebbe funzionare in modo strano, se hai nomi duplicati nelle colonne, quindi per fare ciò puoi rinominare la colonna che desideri eliminare la colonna con un nuovo nome. Oppure puoi riassegnare DataFrame in questo modo:
df = df.iloc[:, [j for j, c in enumerate(df.columns) if j != i]]
Rilascia più colonne in questo modo:
cols = [1,2,4,5,12]
df.drop(df.columns[cols],axis=1,inplace=True)
inplace=True
viene utilizzato per apportare le modifiche nel frame di dati stesso senza fare cadere la colonna su una copia del frame di dati. Se è necessario mantenere intatto l'originale, utilizzare:
df_after_dropping = df.drop(df.columns[cols],axis=1)
inplace=True
dovrai farlo df = df.drop()
se vuoi vedere il cambiamento in df
sé.
Se ci sono più colonne con nomi identici, le soluzioni fornite finora rimuoveranno tutte le colonne, il che potrebbe non essere quello che stai cercando. Questo può essere il caso se si sta tentando di rimuovere colonne duplicate tranne un'istanza. L'esempio seguente chiarisce questa situazione:
# make a df with duplicate columns 'x'
df = pd.DataFrame({'x': range(5) , 'x':range(5), 'y':range(6, 11)}, columns = ['x', 'x', 'y'])
df
Out[495]:
x x y
0 0 0 6
1 1 1 7
2 2 2 8
3 3 3 9
4 4 4 10
# attempting to drop the first column according to the solution offered so far
df.drop(df.columns[0], axis = 1)
y
0 6
1 7
2 8
3 9
4 10
Come puoi vedere, entrambe le colonne X sono state eliminate. Soluzione alternativa:
column_numbers = [x for x in range(df.shape[1])] # list of columns' integer indices
column_numbers .remove(0) #removing column integer index 0
df.iloc[:, column_numbers] #return all columns except the 0th column
x y
0 0 6
1 1 7
2 2 8
3 3 9
4 4 10
Come puoi vedere, questo ha rimosso veramente solo la 0a colonna (prima "x").
È necessario identificare le colonne in base alla loro posizione nel frame di dati. Ad esempio, se si desidera eliminare (del) i numeri di colonna 2,3 e 5, sarà,
df.drop(df.columns[[2,3,5]], axis = 1)
Se hai due colonne con lo stesso nome. Un modo semplice è rinominare manualmente le colonne in questo modo: -
df.columns = ['column1', 'column2', 'column3']
Quindi puoi rilasciare tramite l'indice di colonna come richiesto, in questo modo: -
df.drop(df.columns[1], axis=1, inplace=True)
df.column[1]
lascerà cadere l'indice 1.
Ricorda asse 1 = colonne e asse 0 = righe.
se vuoi davvero farlo con numeri interi (ma perché?), allora potresti costruire un dizionario.
col_dict = {x: col for x, col in enumerate(df.columns)}
quindi df = df.drop(col_dict[0], 1)
funzionerà come desiderato
modifica: puoi metterlo in una funzione che lo fa per te, anche se in questo modo crea il dizionario ogni volta che lo chiami
def drop_col_n(df, col_n_to_drop):
col_dict = {x: col for x, col in enumerate(df.columns)}
return df.drop(col_dict[col_n_to_drop], 1)
df = drop_col_n(df, 2)
È possibile utilizzare la seguente riga per eliminare le prime due colonne (o qualsiasi colonna non necessaria):
df.drop([df.columns[0], df.columns[1]], axis=1)