pandas数据帧有2行标题并导出到csv

时间:2014-06-23 18:37:22

标签: python csv pandas 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"]

我需要将secod行添加到标题

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

我的df现在是

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

但是当我将这个数据帧写入csv文件

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

我按预期更多地获得一行

AA,BB,CC
DD,EE,FF
,,
a,b,c1
a,b,c2
a,b,c3

4 个答案:

答案 0 :(得分:6)

这是一个丑陋的黑客攻击,但如果你现在需要一些工作(tm),你可以分两部分写出来:

>>> 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

答案 1 :(得分:3)

我认为这是to_csv中的错误。如果您正在寻找解决方法,那么这里有一对。

要在此csv中回读,请指定标题行*:

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

*奇怪的是,这似乎忽略了空白行。

要写出来,你可以先写下标题然后追加:

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)

请注意MultiIndex列的to_csv部分:

In [21]: '\n'.join([','.join(h) for h in zip(*df.columns)]) + '\n'
Out[21]: 'AA,BB,CC\nDD,EE,FF\n'

答案 2 :(得分:2)

使用df.to_csv("test.csv", index = False, tupleize_cols=True)将生成的CSV设置为:

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

要读回来:

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

获得您想要的确切输出:

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)

答案 3 :(得分:2)

建立在@ DSM的解决方案之上:

如果你需要(像我一样)将相同的黑客应用到导出到 excel , 所需的主要变化(除了与to_excel方法的预期差异)实际上是删除用于列标签的多索引...

那是因为.to_excel不支持写出一个df,它具有列的多索引但没有索引(对.to_excel方法提供索引= False),而不是.to_csv

无论如何,这就是它的样子:

>>> 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