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