我有一个数据框
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
答案 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
中的错误。如果您正在寻找解决方法,那么这里有一对。
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