Tengo algunos datos y cuando los importo obtengo las siguientes columnas innecesarias Estoy buscando una manera fácil de eliminar todos estos
'Unnamed: 24', 'Unnamed: 25', 'Unnamed: 26', 'Unnamed: 27',
'Unnamed: 28', 'Unnamed: 29', 'Unnamed: 30', 'Unnamed: 31',
'Unnamed: 32', 'Unnamed: 33', 'Unnamed: 34', 'Unnamed: 35',
'Unnamed: 36', 'Unnamed: 37', 'Unnamed: 38', 'Unnamed: 39',
'Unnamed: 40', 'Unnamed: 41', 'Unnamed: 42', 'Unnamed: 43',
'Unnamed: 44', 'Unnamed: 45', 'Unnamed: 46', 'Unnamed: 47',
'Unnamed: 48', 'Unnamed: 49', 'Unnamed: 50', 'Unnamed: 51',
'Unnamed: 52', 'Unnamed: 53', 'Unnamed: 54', 'Unnamed: 55',
'Unnamed: 56', 'Unnamed: 57', 'Unnamed: 58', 'Unnamed: 59',
'Unnamed: 60'
Están indexados por indexación 0, así que probé algo como
df.drop(df.columns[[22, 23, 24, 25,
26, 27, 28, 29, 30, 31, 32 ,55]], axis=1, inplace=True)
Pero esto no es muy eficiente. Intenté escribir algunos bucles for, pero esto me pareció un mal comportamiento de Pandas. Por eso hago la pregunta aquí.
He visto algunos ejemplos que son similares ( Soltar pandas de varias columnas ) pero esto no responde a mi pregunta.
df.drop
una lista de nombres de columnas:df.drop(['Unnamed: 24', 'Unnamed: 25', ...], axis=1)
df = df[cols_of_interest]
, de lo contrario podría cortar el df por columnas y obtener las columnasdf.drop(df.ix[:,'Unnamed: 24':'Unnamed: 60'].head(0).columns, axis=1)
Respuestas:
No sé a qué te refieres con ineficiente, pero si te refieres en términos de escritura, podría ser más fácil seleccionar las columnas de interés y volver a asignarlas al df:
Dónde
cols_of_interest
hay una lista de las columnas que le interesan.O puede cortar las columnas y pasar esto a
drop
:df.drop(df.ix[:,'Unnamed: 24':'Unnamed: 60'].head(0).columns, axis=1)
La llamada a
head
solo selecciona 0 filas ya que solo nos interesan los nombres de las columnas en lugar de los datosactualizar
Otro método: sería más sencillo usar la máscara booleana de
str.contains
e invertirla para enmascarar las columnas:In [2]: df = pd.DataFrame(columns=['a','Unnamed: 1', 'Unnamed: 1','foo']) df Out[2]: Empty DataFrame Columns: [a, Unnamed: 1, Unnamed: 1, foo] Index: [] In [4]: ~df.columns.str.contains('Unnamed:') Out[4]: array([ True, False, False, True], dtype=bool) In [5]: df[df.columns[~df.columns.str.contains('Unnamed:')]] Out[5]: Empty DataFrame Columns: [a, foo] Index: []
fuente
df
con su nueva columna,append
tal vez debería, pero realmente no entiendo su pregunta, debe publicar una pregunta real en SO en lugar de hacer un comentario, ya que es deficiente en SOEl enfoque más simple con diferencia es:
yourdf.drop(['columnheading1', 'columnheading2'], axis=1, inplace=True)
fuente
SettingWithCopyWarning
advertencia.axis
explicado: stackoverflow.com/questions/22149584/… . Esencialmente,axis=0
se dice que es "por columnas" yaxis=1
"por filas".inplace=True
significa queDataFrame
se modifica en su lugar.yourdf = yourdf.drop(['columnheading1', 'columnheading2'], axis=1)
Mi favorito personal, y más fácil que las respuestas que he visto aquí (para varias columnas):
df.drop(df.columns[22:56], axis=1, inplace=True)
O creando una lista para varias columnas.
col = list(df.columns)[22:56] df.drop(col, axis=1, inplace=1)
fuente
Esta es probablemente una buena forma de hacer lo que quiere. Eliminará todas las columnas que contengan 'Sin nombre' en su encabezado.
for col in df.columns: if 'Unnamed' in col: del df[col]
fuente
for col in df.columns:
se puede simplificarfor col in df:
, además, el OP no ha indicado cuál es el esquema de nomenclatura para las otras columnas, todas podrían contener 'Sin nombre', también esto es ineficiente ya que elimina las columnas una a la vezinplace = True
Puede hacer esto en una línea y una vez:
df.drop([col for col in df.columns if "Unnamed" in col], axis=1, inplace=True)
Esto implica menos movimiento / copia del objeto que las soluciones anteriores.
fuente
No estoy seguro de si esta solución se ha mencionado en alguna parte, pero una forma de hacerlo es
pandas.Index.difference
.>>> df = pd.DataFrame(columns=['A','B','C','D']) >>> df Empty DataFrame Columns: [A, B, C, D] Index: [] >>> to_remove = ['A','C'] >>> df = df[df.columns.difference(to_remove)] >>> df Empty DataFrame Columns: [B, D] Index: []
fuente
Puede simplemente pasar los nombres de las columnas como una lista especificando el eje como 0 o 1
Por defecto eje = 0
data.drop(["Colname1","Colname2","Colname3","Colname4"],axis=1)
fuente
Simple y fácil. Elimina todas las columnas después del 22.
df.drop(columns=df.columns[22:]) # love it
fuente
df
en su lugar, agregue la banderainplace=True
, De modo quedf.drop(columns=df.columns[22:], inplace=True)
Lo siguiente funcionó para mí:
for col in df: if 'Unnamed' in col: #del df[col] print col try: df.drop(col, axis=1, inplace=True) except Exception: pass
fuente
df = df[[col for col in df.columns if not ('Unnamed' in col)]]
fuente