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.dropuna 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_interesthay 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
headsolo 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.containse 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
dfcon su nueva columna,appendtal 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
SettingWithCopyWarningadvertencia.axisexplicado: stackoverflow.com/questions/22149584/… . Esencialmente,axis=0se dice que es "por columnas" yaxis=1"por filas".inplace=Truesignifica queDataFramese 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 = TruePuede 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 itfuente
dfen 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: passfuente
df = df[[col for col in df.columns if not ('Unnamed' in col)]]fuente