Pandas - 使用 to_csv 编写多索引行

Posted

技术标签:

【中文标题】Pandas - 使用 to_csv 编写多索引行【英文标题】:Pandas - write Multiindex rows with to_csv 【发布时间】:2013-06-25 08:00:35 【问题描述】:

我正在使用 to_csv 将 Multiindex DataFrame 写入 csv 文件。 csv 文件有一列包含元组中的多索引,例如:

('a', 'x')
('a', 'y')
('a', 'z')
('b', 'x')
('b', 'y')
('b', 'z')

但是,我希望能够将 Multiindex 输出到两列而不是一列元组,例如:

a, x
 , y
 , z
b, x
 , y
 , z

看起来tupleize_cols 可以为列实现这一点,但对于行没有这样的选项。有没有办法做到这一点?

【问题讨论】:

tupleize_cols 用于列上的多索引(它在 0.12 中出现);可能只是reset_index().set_index(['idxa','idxb']).to_csv() 是您最好的选择(在回读时指定index_col=['idxa','idxb'] 【参考方案1】:

我觉得这样就可以了

In [3]: df = DataFrame(dict(A = 'foo', B = 'bar', value = 1),index=range(5)).set_index(['A','B'])

In [4]: df
Out[4]: 
         value
A   B         
foo bar      1
    bar      1
    bar      1
    bar      1
    bar      1

In [5]: df.to_csv('test.csv')

In [6]: !cat test.csv
A,B,value
foo,bar,1
foo,bar,1
foo,bar,1
foo,bar,1
foo,bar,1

In [7]: pd.read_csv('test.csv',index_col=[0,1])
Out[7]: 
         value
A   B         
foo bar      1
    bar      1
    bar      1
    bar      1
    bar      1

使用索引重复编写(虽然有点 hack)

In [27]: x = df.reset_index()

In [28]: mask = df.index.to_series().duplicated()

In [29]: mask
Out[29]: 
A    B  
foo  bar    False
     bar     True
     bar     True
     bar     True
     bar     True
dtype: bool

In [30]: x.loc[mask.values,['A','B']] = ''

In [31]: x
Out[31]: 
     A    B  value
0  foo  bar      1
1                1
2                1
3                1
4                1

In [32]: x.to_csv('test.csv')

In [33]: !cat test.csv
,A,B,value
0,foo,bar,1
1,,,1
2,,,1
3,,,1
4,,,1

实际上回读有点棘手

In [37]: pd.read_csv('test.csv',index_col=0).ffill().set_index(['A','B'])
Out[37]: 
         value
A   B         
foo bar      1
    bar      1
    bar      1
    bar      1
    bar      1

【讨论】:

对不起,我可能没有解释清楚。我希望实现的是删除 csv 文件中的重复条目。在您的示例中,我希望 'foo' 在 csv 文件中只出现一次,这样当您 cat test.csv 时,您会在第一行看到一个 'foo' 而在后续行中看到空白。 已更新...虽然这是非常不标准的,并且不确定这是否会推广 让我问你,这种格式的 csv 有用/常见吗?例如非重复索引? 我不知道这是否常见,但在我的情况下,它作为视觉表示是有用/方便的。想象一下,如果我需要将 csv 表打印为某种报告。假设有 100 行,第一级多索引有 3 个组。不重复的索引将很容易直观地识别这 3 个组。 ok....在任何情况下都将此解决方案添加到食谱中(将在今天晚些时候更新):pandas.pydata.org/pandas-docs/dev/cookbook.html#csv

以上是关于Pandas - 使用 to_csv 编写多索引行的主要内容,如果未能解决你的问题,请参考以下文章

Pandas 多索引行和列:用匹配行中的值替换 NaN

如何使用 df.to_csv 为多索引数据帧 python3 格式化 csv 文件

pandas 将嵌套字典转换为 mutiIndex 行和列

使用 pandas.DataFrame.to_csv() 按列输出不同的精度?

在写入Excel时,“解析”一个pandas多索引

pandas的to_csv()使用细节和一些参数