Tengo una situación en la que a veces, cuando leo un csv de df me sale un no deseado del índice de tipo columna denominada unnamed:0.

file.csv

,A,B,C
0,1,2,3
1,4,5,6
2,7,8,9

El CSV se lee con esto:

pd.read_csv('file.csv')

   Unnamed: 0  A  B  C
0           0  1  2  3
1           1  4  5  6
2           2  7  8  9

Esto es muy molesto! ¿Alguien tiene una idea de cómo deshacerse de esto?

  • Si el CSV viene de arriba (donde extracción durante la salvación no es una opción), usted puede manejar durante la lectura. Por favor, consulte esta respuesta.

3 Comentarios

  1. 131

    Es el índice de la columna, pasar index=False para no escribirlo, ver la docs

    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         a         b         c
    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]:
              a         b         c
    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 decir read_csv que la primera columna es la columna de índice pasando index_col=0:

    In [40]:
    pd.read_csv(io.StringIO(df.to_csv()), index_col=0)
    
    Out[40]:
              a         b         c
    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
    • Gracias EdChum! Molestia eliminado! A pensar que me estaba leyendo los documentos y buscando esta solución. De alguna manera, yo no estaba bien de la comprensión.
    • Muchas veces los conjuntos de datos que recibe de otros lugares ya contienen esta columna así que en realidad no ayudan a saber cómo producir el «derecho» conjunto de datos con los parámetros correctos. Hay una manera de eliminar esta columna cuando se carga cuando ya está allí?
    • desafortunadamente, no hay skipcols arg para read_csv, después de leer en el csv que sólo podría hacer df = df.drop(columns=df.columns[0]) o se podía leer las columnas en la primera y luego pasar los cols menos la primera columna de algo como cols = pd.read_csv( ....., nrows=1).columns y, a continuación, vuelva a leer de nuevo df = pd.read_csv(....., usecols=cols[1:]) esto evita la sobrecarga de la lectura superflua la columna y, a continuación, caer después
  2. 15

    Este problema probablemente se manifiesta porque el archivo CSV se guardan junto con su RangeIndex (que por lo general no tienen un nombre). La solución sería realmente se deben hacer cuando el ahorro de la DataFrame, pero esto no es siempre una opción.

    Evitar el Problema: read_csv con index_col argumento

    De la OMI, la solución más sencilla sería leer la columna sin nombre como el índice. Especificar un index_col=[0] argumento para pd.read_csv, esto se lee en la primera columna como el índice.

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

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

    Nota

    Se podía haber evitado esta en el primer lugar por
    el uso de index=False cuando la creación de la salida CSV, si el DataFrame no tiene un índice para comenzar
    con.

    df.to_csv('file.csv', index=False)

    Pero como se mencionó anteriormente, este no es siempre una opción.


    Solución provisional: Filtrado con str.match

    Si usted no puede modificar el código para leer/escribir en el archivo CSV, puede simplemente quitar la columna de filtrado con str.partido:

    df 
    
       Unnamed: 0  a  b  c
    0           0  x  x  x
    1           1  x  x  x
    2           2  x  x  x
    3           3  x  x  x
    4           4  x  x  x
    
    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')]
    
       a  b  c
    0  x  x  x
    1  x  x  x
    2  x  x  x
    3  x  x  x
    4  x  x  x
    • Muchas gracias! Que index_col=[0] corregir fácilmente resuelto este problema molesto de ‘sin nombre:0’ y repuestos código de detallado reinventar la rueda.
  3. 7

    Otro caso que esto podría estar sucediendo es que si tus datos se escribe incorrectamente a su csv tener cada fila de la final con una coma. Esto te dejará con un anónimo columna Unnamed: x al final de los datos cuando se intenta leer en una df.

    • He utilizado usecols=range(0,10) para cortar la columna sin nombre

Dejar respuesta

Please enter your comment!
Please enter your name here