如何用pandas to_csv()编写带有多个标题行的csv文件?

时间:2014-03-12 15:47:57

标签: python csv pandas

考虑使用date列作为索引的数据框以及带有一些观察结果的三列xyz。我想将此数据框的内容写入.csv文件。我知道我可以使用df.to_csv,但是,我想在单元中添加第二个标题行。在此示例中,所需的.csv文件如下所示:

date,x,y,z  
(yyyy-mm-dd),(s),(m),(kg)  
2014-03-12,1,2,3  
2014-03-13,4,5,6  
...

1 个答案:

答案 0 :(得分:3)

这并不会在您的示例中生成确切的输出,但它已经关闭了。您可以使用多索引列来存储带有列标签的第二个标题(单位):

>>> import pandas as pd
>>> columns = pd.MultiIndex.from_tuples(
...     zip(['date', 'x', 'y', 'z'],
...         ['(yyyy-mm-dd)', '(s)', '(m)', '(kg)']))
>>> data = [['2014-03-12', 1, 2, 3],
...         ['2014-03-13', 4, 5, 6]]
>>> df = pd.DataFrame(data, columns=columns)
>>> df
          date   x   y    z
  (yyyy-mm-dd) (s) (m) (kg)
0   2014-03-12   1   2    3
1   2014-03-13   4   5    6

以这种方式存储第二个标头可以使您的列保持正确的类型(例如,列x应该是整数类型):

>>> df.dtypes
date  (yyyy-mm-dd)    object
x     (s)              int64
y     (m)              int64
z     (kg)             int64
dtype: object

如果您已将第二个标题存储为DataFrame中的,那么您的列dtypes将变为object,您可能会将其{39}变为DataFrame。我想要。

以CSV格式编写>>> df.to_csv('out.csv', index=False) >>> !cat out.csv date,x,y,z (yyyy-mm-dd),(s),(m),(kg) ,,, 2014-03-12,1,2,3 2014-03-13,4,5,6 会产生与您的示例非常相似的内容:

DataFrame

唯一的区别是额外的逗号行,这是pandas将多行标题与实际数据行分开的方式。这样可以将CSV文件读回到等效的>>> df2 = pd.read_csv('out.csv', header=[0, 1]) >>> df2 date x y z (yyyy-mm-dd) (s) (m) (kg) 0 2014-03-12 1 2 3 1 2014-03-13 4 5 6

{{1}}

注意:我发现很多信息散布在this SO question中。