【问题标题】:How to correctly handle a named index, when saving multiindex csv-files?保存多索引 csv 文件时如何正确处理命名索引?
【发布时间】: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)

标签: python-3.x pandas indexing multi-index


【解决方案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 的有限性,这实际上是有道理的。)
猜你喜欢
  • 2012-08-01
  • 2019-07-29
  • 2018-10-02
  • 1970-01-01
  • 2014-03-19
  • 2021-10-13
  • 1970-01-01
  • 2017-05-01
  • 2016-06-16
相关资源
最近更新 更多