保存多索引 csv 文件时如何正确处理命名索引?

Posted

技术标签:

【中文标题】保存多索引 csv 文件时如何正确处理命名索引?【英文标题】:How to correctly handle a named index, when saving multiindex csv-files? 【发布时间】:2020-10-23 05:22:12 【问题描述】:

正如我习惯于使用简单的 DataFrame 表一样,我想为具有多索引的表的索引添加一个名称。由于某种原因,原本可以正常工作的导入现在会引发错误。

我只想从保存 csv 时的 csv 中取回同一张表。

谁能指出我做错了什么,或者为什么这不能像我预期的那样工作?

如果它与 csv 有关,是否可以使用另一种基于文本的格式?

import numpy as np
import pandas as pd

# first example, everything works as expected
# df = pd.DataFrame(np.zeros((10, 4)), columns=['a','b','c','d'])

# second example, read_csv() throws error - bug?
df = pd.DataFrame(np.zeros((10, 4)),
                  columns=pd.MultiIndex.from_product([
                      ['A', 'B'],
                      ['x', 'y']
                  ]))

df.index.name = 'idx'
print(df)
df.to_csv('test.csv')
df = pd.read_csv('test.csv', index_col='idx')
print(df)

【问题讨论】:

index 不是你的 MultiIndex... 这是你的专栏,所以 df.index.name = 'idx' 可能没有达到你的预期。 pd.read_csv('test.csv', header=[0,1]) 能满足你的需要吗? @ChrisA 是的,我确实想将 columns 与 MultiIndex 一起使用,df.index.name = 'idx' 似乎确实命名了索引列(通常枚举 0,1,2, 3,4,...) 到idx,还是错了?我必须查一下这个header 参数。 试试pd.read_csv('test.csv', header=[0,1], index_col=0) 【参考方案1】:

IIUC,如果您愿意,可以将names 参数传递给MultiIndex.from_product 方法,并使用read_csv 方法中的header 参数设置您的列MultiIndex。你也可以在这里传递0 作为你的 index_col:

df = pd.DataFrame(np.zeros((10, 4)),
                  columns=pd.MultiIndex.from_product([
                      ['A', 'B'],
                      ['x', 'y']
                  ], names=['level1', 'level2']))

df.index.name = 'idx'

df.to_csv('test.csv')

df = pd.read_csv('test.csv', header=[0,1], index_col=0)

[出]

level1    A         B     
level2    x    y    x    y
idx                       
0       0.0  0.0  0.0  0.0
1       0.0  0.0  0.0  0.0
2       0.0  0.0  0.0  0.0
3       0.0  0.0  0.0  0.0
4       0.0  0.0  0.0  0.0
5       0.0  0.0  0.0  0.0
6       0.0  0.0  0.0  0.0
7       0.0  0.0  0.0  0.0
8       0.0  0.0  0.0  0.0
9       0.0  0.0  0.0  0.0

【讨论】:

感谢您的回答(和更新),这正是我想要的! 很高兴它有帮助:) 所以以防万一其他人遇到这种情况:如果使用了 MultiIndex,似乎不可能直接将整个 DataFrame 结构编码为 csv 并在没有任何其他信息的情况下再次恢复它。 (考虑到 csv 的有限性,这实际上是有道理的。)

以上是关于保存多索引 csv 文件时如何正确处理命名索引?的主要内容,如果未能解决你的问题,请参考以下文章

将列添加到熊猫数据框以进行多索引

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

只选择多索引DataFrame的一个索引

如何获取多索引数据帧的前两个索引的字典

从 csv 文件中读取列的多索引

Pandas - 使用 to_csv 编写多索引行