Tengo un dataframe

df = pd.DataFrame(columns = ["AA", "BB", "CC"])
df.loc[0]= ["a", "b", "c1"]
df.loc[1]= ["a", "b", "c2"]
df.loc[2]= ["a", "b", "c3"]

Necesito agregar secod fila de encabezado

df.columns = pd.MultiIndex.from_tuples(zip(df.columns, ["DD", "EE", "FF"]))

mi df es ahora

  AA BB  CC
  DD EE  FF
0  a  b  c1
1  a  b  c2
2  a  b  c3

pero cuando escribo esto dataframe a archivo csv

df.to_csv("test.csv", index = False)

Puedo obtener una hilera más de lo esperado

AA,BB,CC
DD,EE,FF
,,
a,b,c1
a,b,c2
a,b,c3
  • Esto sin duda parece un error, la recomendación de publicar esto como una github problema.
  • cualquier workarround cómo obtener el formato esperado sin este extra de la línea?
  • Tarde a la fiesta, lo sé. Pero yo estaba buscando una solución para el mismo problema. Los Pandas 0.19.0 y encima tiene este tema fijo
InformationsquelleAutor Meloun | 2014-06-23

4 Comentarios

  1. 6

    Que es un feo hack, pero si usted necesita algo de trabajo Ahora(tm), se puede escribir en dos partes:

    >>> pd.DataFrame(df.columns.tolist()).T.to_csv("noblankrows.csv", mode="w", header=False, index=False)
    >>> df.to_csv("noblankrows.csv", mode="a", header=False, index=False)
    >>> !cat noblankrows.csv
    AA,BB,CC
    DD,EE,FF
    a,b,c1
    a,b,c2
    a,b,c3
    • lol, snap! A pesar de que esta es una agradable manera de escribir el encabezado!
    • Cuidado… he intentado esto, y se re-ordena los encabezados en orden alfabético, que luego fueron fuera de la alineación con los valores de la columna.
  2. 3

    Creo que este es un error en to_csv. Si usted está buscando soluciones, a continuación, he aquí un par.

    De leer de nuevo en esta csv especificar el encabezado de filas*:

    In [11]: csv = "AA,BB,CC
    DD,EE,FF
    ,,
    a,b,c1
    a,b,c2
    a,b,c3"
    
    In [12]: pd.read_csv(StringIO(csv), header=[0, 1])
    Out[12]:
      AA BB  CC
      DD EE  FF
    0  a  b  c1
    1  a  b  c2
    2  a  b  c3

    *extrañamente esta parece ignorar las líneas en blanco.

    Para escribir, usted puede escribir el encabezado de la primera y, a continuación, agregar:

    with open('test.csv', 'w') as f:
        f.write('\n'.join([','.join(h) for h in zip(*df.columns)]) + '\n')
    df.to_csv('test.csv', mode='a', index=False, header=False)

    Nota la to_csv parte de MultiIndex columna aquí:

    In [21]: '\n'.join([','.join(h) for h in zip(*df.columns)]) + '\n'
    Out[21]: 'AA,BB,CC\nDD,EE,FF\n'
    • no es un error, este es el formato definido, puede especificar tupleize_cols=True hacer es escribir un multi-índice de encabezado de una fila.
    • read_csv puede leer con o w/s de la línea vacía
    • esto no es acerca de lo que es como una fila única: Tratar de sin tupleize_cols, agrega el ,,,, línea de la csv (un bug??).
    • si no se especifica el encabezado de obtener una fila de NaN…
    • los nombres de Ninguno, pero todavía TIENE nombres. no es un bug. Con el fin de tener una reproducción exacta se TIENE que tener la línea. el lector pasa a ser capaz de leer el formato. La suya es una cuestión abierta para que NO se imprima la línea vacía que es una cuestión estilística. el lector es robusto a este. si no se especifica el encabezado en un multi-columnas de índice es un error de USUARIO. no es un bug.
  3. 2

    Uso df.to_csv("test.csv", index = False, tupleize_cols=True) para obtener el CSV resultante será:

    "('AA', 'DD')","('BB', 'EE')","('CC', 'FF')"
    a,b,c1
    a,b,c2
    a,b,c3

    A leer de nuevo:

    df2=pd.read_csv("test.csv", tupleize_cols=True)
    df2.columns=pd.MultiIndex.from_tuples(eval(','.join(df2.columns)))

    Para obtener el resultado exacto que quería:

    with open('test.csv', 'a') as f:
        pd.DataFrame(np.asanyarray(df.columns.tolist())).T.to_csv(f, index = False, header=False)
        df.to_csv(f, index = False, header=False)
    • la tercera fila es inesperado..
    • Que no sería una buena forma de escribir a un archivo CSV de todos modos porque usted también tendrá un tiempo difícil la lectura. Ver editar.
    • Necesito 2-línea de encabezado como se muestra arriba
    • Yeap, obtendrá la misma df, si eso es lo que están pidiendo. Ver editar
    • lo siento, pero no estoy satisfecho con eso … necesito realmente la salida como se describe porque es una entrada para otra aplicación, no hay pandas lectura de la espalda..
    • Ver editar. Usted puede hacerlo en dos pasos, escriba el encabezado, entonces el cuerpo.

  4. 2

    Edificio en la parte superior de @DSM solución:

    si usted necesita (como hice yo) para aplicar el mismo truco para una exportación a excel,
    el principal cambio necesario (aparte de las diferencias esperadas con la to_excel método) es en realidad eliminar el multiindex utilizado para los rótulos de columna…

    Que es porque .to_excel no admite la escritura de una df de tener un multiindex para las columnas, pero no de índice (proporcionando índice=False al .to_excel método), por el contrario, para .to_csv

    De todos modos, aquí es lo que se vería como:

    >>> writer = pd.ExcelWriter("noblankrows.xlsx")
    >>> headers = pd.DataFrame(df.columns.tolist()).T
    >>> headers.to_excel(
            writer, header=False, index=False)
    >>> df.columns = pd.Index(range(len(df.columns)))  # that's what I was referring to...
    >>> df.to_excel(
            writer, header=False, index=False, startrow=len(headers))
    >>> writer.save()
    >>> pd.read_excel("noblankrows.xlsx").to_csv(sys.stdout, index=False)
    AA,BB,CC
    DD,EE,FF
    a,b,c1
    a,b,c2
    a,b,c3

Dejar respuesta

Please enter your comment!
Please enter your name here