【问题标题】:How can I write a csv file with multiple header lines with pandas to_csv()?如何使用 pandas to_csv() 编写具有多个标题行的 csv 文件?
【发布时间】:2014-04-16 21:30:12
【问题描述】:

考虑一个具有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  
...

【问题讨论】:

  • 也许你可以用普通的python输出(file.write())写第一行,然后用单位行作为标题写数据框。 (不确定这是否有效,但也许是一种方法)
  • 这与在开头插入带有“第二个”标题的新行有何不同?
  • @Ben:如何使用索引字符串来做到这一点(请记住我有一个日期时间索引)?我尝试使用df.loc(),但显然我的语法错误(我总是收到错误ValueError: unsafe appending to index of type DatetimeIndex with a key yyyy-mm-dd)。

标签: python csv pandas


【解决方案1】:

这不会在您的示例中产生确切的输出,但它很接近。您可以使用多索引列来存储带有列标签的第二个标题(单位):

>>> 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,这可能是您不想要的。

以 CSV 格式编写 DataFrame 会产生与您的示例非常相似的内容:

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

唯一的区别是额外的逗号行,这是 pandas 将多行标题与实际数据行分开的方式。这允许将 CSV 文件读回等效的 DataFrame

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

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

【讨论】:

    猜你喜欢
    • 2013-06-25
    • 2020-03-16
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 2021-02-04
    • 2013-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多