保存多索引 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 文件时如何正确处理命名索引?的主要内容,如果未能解决你的问题,请参考以下文章