Cómo deshacerse de la columna `Unnamed:` en un dataframe de pandas

Tengo una situación en la que a veces, cuando leo un csv de df , obtengo una columna similar a un índice no deseado llamada unnamed:0 . Esto es muy molesto! Yo he tratado

 merge.to_csv('xy.df', mode = 'w', inplace=False) 

lo cual pensé que era una solución para esto, pero todavía recibo la columna unnamed:0 ! ¿Alguien tiene una idea sobre esto?

Es la columna del índice, pase el index=False para no escribirlo, vea los documentos

Ejemplo:

 In [37]: df = pd.DataFrame(np.random.randn(5,3), columns=list('abc')) pd.read_csv(io.StringIO(df.to_csv())) Out[37]: Unnamed: 0 abc 0 0 0.109066 -1.112704 -0.545209 1 1 0.447114 1.525341 0.317252 2 2 0.507495 0.137863 0.886283 3 3 1.452867 1.888363 1.168101 4 4 0.901371 -0.704805 0.088335 

Comparar con:

 In [38]: pd.read_csv(io.StringIO(df.to_csv(index=False))) Out[38]: abc 0 0.109066 -1.112704 -0.545209 1 0.447114 1.525341 0.317252 2 0.507495 0.137863 0.886283 3 1.452867 1.888363 1.168101 4 0.901371 -0.704805 0.088335 

Opcionalmente, también podría decirle a read_csv que la primera columna es la columna de índice al pasar index_col=0 :

 In [40]: pd.read_csv(io.StringIO(df.to_csv()), index_col=0) Out[40]: abc 0 0.109066 -1.112704 -0.545209 1 0.447114 1.525341 0.317252 2 0.507495 0.137863 0.886283 3 1.452867 1.888363 1.168101 4 0.901371 -0.704805 0.088335 

Otro caso en el que esto podría estar sucediendo es si sus datos se escribieron incorrectamente en su csv para que cada fila termine con una coma. Esto te dejará con una columna sin Unnamed: x al final de tus datos cuando intentas leerlo en un df .

Si no está en posición de eliminar el índice al guardar en CSV (es decir, si el archivo CSV proviene de la fuente), entonces la otra opción es usar index_col=[0] con pd.read_csv . IOW, manéjalo al leer, no al escribir.

 df = pd.DataFrame('x', index=range(5), columns=list('abc')) df abc 0 xxx 1 xxx 2 xxx 3 xxx 4 xxx # Save DataFrame to CSV. df.to_csv('file.csv') 

 pd.read_csv('file.csv') Unnamed: 0 abc 0 0 xxx 1 1 xxx 2 2 xxx 3 3 xxx 4 4 xxx # Now try this again, with the extra argument. pd.read_csv('file.csv', index_col=[0]) abc 0 xxx 1 xxx 2 xxx 3 xxx 4 xxx 

Alternativamente, puedes filtrar con str.match :

 df Unnamed: 0 abc 0 0 xxx 1 1 xxx 2 2 xxx 3 3 xxx 4 4 xxx df.columns # Index(['Unnamed: 0', 'a', 'b', 'c'], dtype='object') df.columns.str.match('Unnamed') # array([ True, False, False, False]) df.loc[:, ~df.columns.str.match('Unnamed')] abc 0 xxx 1 xxx 2 xxx 3 xxx 4 xxx