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

Posted

技术标签:

【中文标题】从 csv 文件中读取列的多索引【英文标题】:Read multi-index on the columns from csv file 【发布时间】:2014-02-14 15:10:19 【问题描述】:

我有一个如下所示的 .csv 文件:

Male, Male, Male, Female, Female
R, R, L, R, R
.86, .67, .88, .78, .81

我想把它读入一个df,这样我就有了:

    Male        Female
    R       L   R
0   .86 .67 .88 .78 .81

我做到了:

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

但是headers 没有删减它。结果是

Empty DataFrame
Columns: [(Male, R), (Male, R), (Male, L), (Female, R), (Female, R)]
Index: []

然而,标题上的文档说:

(...)Can be a list of integers that specify row
locations for a multi-index on the columns E.g. [0,1,3]

我做错了什么?我怎么可能让它工作?

【问题讨论】:

【参考方案1】:

我认为问题在于您有重复的列:两个(女性,R)。

不确定这是错误还是重复的列是不可接受的。这里有一个解决方法:

首先使用 tupleize_cols=True 读取 csv

In [61]: df = pd.read_csv('test.csv', header=[0, 1], skipinitialspace=True, tupleize_cols=True)

In [62]: df
Out[62]: 
   (Male, R)  (Male, R)  (Male, L)  (Female, R)  (Female, R)
0       0.67       0.67       0.88         0.81         0.81

[1 rows x 5 columns]

然后将列的类型从Index转换为MultiIndex

In [63]: df.columns = pd.MultiIndex.from_tuples(df.columns)

In [64]: df
Out[64]: 
   Male              Female      
      R     R     L       R     R
0  0.67  0.67  0.88    0.81  0.81

[1 rows x 5 columns]

【讨论】:

您好,感谢您的建议。乍一看,这似乎是合法的,但值在某种程度上被搞砸了,看看我们最初的那些.86, .67, .88, .78, .81 抱歉误导。似乎这是另一个要修复的错误。当我找到另一种方法来实现你的目标时,我会更新这篇文章 C:\Python\Python36_64b\lib\site-packages\pandas\io\parsers.py:813: FutureWarning: 'tupleize_cols' 参数已被弃用,将在未来版本中删除。然后,列元组将始终转换为 MultiIndex。 self.options, self.engine = self._clean_options(options, engine)【参考方案2】:

从 pandas 0.21 版开始,MultiIndexes 是默认创建的,所以 df = pd.read_csv('file.csv', header=[0,1]) 应该可以完成这项工作。

【讨论】:

以上是关于从 csv 文件中读取列的多索引的主要内容,如果未能解决你的问题,请参考以下文章

如何从具有多级重复列的excel表中取消堆叠df?设置多索引?

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

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

将列从多索引堆叠到单索引

如何为与python中列的最大值对应的多索引的每个级别返回索引

为多索引 Panda 数据框创建基于另一列的新列