columna de caída de pandas del marco de datos de Python usando int

154

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?

usuario1802143
fuente
Me imagino que esto no funcionará por las razones que se muestran aquí: stackoverflow.com/questions/13411544/…
John

Respuestas:

167

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]]
Roman Pekar
fuente
44
Creo que te perdiste el punto: quieren caer por índice, no por etiqueta. La conversión del índice en una etiqueta simplemente se cae por etiqueta :(
Darren
Cómo indexar cols, si tengo que soltar 100 columnas que son continuas en el medio del marco de datos
Sai Kiran
112

Suelte varias columnas como esta:

cols = [1,2,4,5,12]
df.drop(df.columns[cols],axis=1,inplace=True)

inplace=Truese 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)
muon
fuente
3
¿Para qué sirve el argumento in situ?
sidpat
12
si no lo usa inplace=True, tendrá que hacerlo df = df.drop()si desea ver el cambio en dfsí mismo.
muon
Cómo indexar cols, si tengo que soltar 100 columnas que son continuas en el medio del marco de datos.
Sai Kiran
36

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').

Saeed
fuente
1
Eres mi heroe. Estaba tratando de pensar en una forma inteligente de hacer esto durante demasiado tiempo.
ATK7474
5

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)
Kripalu Sar
fuente
4

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.

Leva
fuente
3

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)
mkln
fuente
1

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)

Referencia

Mojtaba Peyrovi
fuente
-1

Como puede haber varias columnas con el mismo nombre, primero debemos cambiar el nombre de las columnas. Aquí hay un código para la solución.

df.columns=list(range(0,len(df.columns)))
df.drop(columns=[1,2])#drop second and third columns
Trueno
fuente