Entiendo que para soltar una columna se usa df.drop ('nombre de columna', eje = 1). ¿Hay alguna manera de soltar una columna usando un índice numérico en lugar del nombre de la columna?
Entiendo que para soltar una columna se usa df.drop ('nombre de columna', eje = 1). ¿Hay alguna manera de soltar una columna usando un índice numérico en lugar del nombre de la columna?
Respuestas:
Puede eliminar la columna en el i
índice de esta manera:
df.drop(df.columns[i], axis=1)
Podría funcionar de forma extraña, si tiene nombres duplicados en las columnas, por lo que para hacer esto puede cambiar el nombre de la columna que desea eliminar por nuevo nombre. O puede reasignar DataFrame de esta manera:
df = df.iloc[:, [j for j, c in enumerate(df.columns) if j != i]]
Suelte varias columnas como esta:
cols = [1,2,4,5,12]
df.drop(df.columns[cols],axis=1,inplace=True)
inplace=True
se usa para realizar los cambios en el marco de datos en sí mismo sin que la columna caiga en una copia del marco de datos. Si necesita mantener su original intacto, use:
df_after_dropping = df.drop(df.columns[cols],axis=1)
inplace=True
, tendrá que hacerlo df = df.drop()
si desea ver el cambio en df
sí mismo.
Si hay varias columnas con nombres idénticos, las soluciones dadas aquí hasta ahora eliminarán todas las columnas, que pueden no ser lo que uno está buscando. Este puede ser el caso si uno está tratando de eliminar columnas duplicadas, excepto una instancia. El siguiente ejemplo aclara esta situación:
# 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
Como puede ver, ambas columnas X fueron descartadas. Solución 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
Como puede ver, esto realmente eliminó solo la columna 0 (primera 'x').
Debe identificar las columnas según su posición en el marco de datos. Por ejemplo, si desea soltar (del) columna número 2,3 y 5, será,
df.drop(df.columns[[2,3,5]], axis = 1)
Si tiene dos columnas con el mismo nombre. Una forma simple es cambiar manualmente el nombre de las columnas de esta manera: -
df.columns = ['column1', 'column2', 'column3']
Luego puede soltar a través del índice de columna como lo solicitó, de esta manera: -
df.drop(df.columns[1], axis=1, inplace=True)
df.column[1]
caerá el índice 1.
Recuerde eje 1 = columnas y eje 0 = filas.
si realmente quieres hacerlo con enteros (pero ¿por qué?), entonces podrías construir un diccionario.
col_dict = {x: col for x, col in enumerate(df.columns)}
entonces df = df.drop(col_dict[0], 1)
funcionará como se desee
editar: puede ponerlo en una función que lo haga por usted, aunque de esta manera crea el diccionario cada vez que lo llama
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)
Puede usar la siguiente línea para soltar las dos primeras columnas (o cualquier columna que no necesite):
df.drop([df.columns[0], df.columns[1]], axis=1)