在groupby之后访问pandas中的分层列

Posted

技术标签:

【中文标题】在groupby之后访问pandas中的分层列【英文标题】:Accessing hierarchical columns in pandas after groupby 【发布时间】:2014-08-02 11:25:56 【问题描述】:

我使用 pandas 对数据集进行分组。当我用不同的函数聚合不同的列时,我得到了一个分层的列结构。

G1 = df.groupby('date').agg('col1': [sum, np.mean], 'col2': 'sum', 'col3': np.mean)

结果:

            col1               col2       col3
               sum      mean      sum       mean
date
2000-11-01    1701  1.384052    82336  54.222945
2000-11-02   11101  1.447894   761963  70.027260
2000-11-03   11285  1.479418   823355  77.984268

不幸的是,我在文档中找不到太多关于这种结果结构的信息。我在 pandas 文档中发现的唯一内容是分层多索引。

如何访问这些值? 目前我做:X['col1']['mean'] 访问整个Series

2000-11-01   1.384052   
2000-11-02   1.447894  
2000-11-03   1.479418  

因此X['col1']['mean'][1] 得到值1.447894,但我想知道性能,因为此代码首先切片col1 (X['col1']) 导致视图/复制(不知道哪个在这种情况下)实际上包含 2 列,然后还有另一部分 mean-column。

有什么建议吗? 在哪里可以找到有关文档中分层列创建的更多信息?

【问题讨论】:

【参考方案1】:

建议一次性完成这些(不使用链接),这尤其允许您进行分配(而不是分配给视图并且修改被垃圾回收)。

以元组的形式访问 MultiIndex* 列:

In [11]: df[('col1', 'mean')]
Out[11]:
date
2000-11-01    1.384052
2000-11-02    1.447894
2000-11-03    1.479418
Name: (col1, mean), dtype: float64

以及使用 loc 的特定值:

In [12]: df.loc['2000-11-01', ('col1', 'mean')]
Out[12]: 1.3840520000000001

(要混合标签、loc和位置,iloc,你必须使用ix)

In [13]: df.ix[0, ('col1', 'mean')]
Out[13]: 1.3840520000000001

*这多索引。

【讨论】:

非常感谢。是的,所以我的假设是正确的,以避免链接。感谢您澄清这些实际上是所谓的 MultiIndexes;我以为这个名字只适用于多行索引......但我看到了这个类比,特别是因为一个人可以很容易地转置一个数据帧(因此仍然保留多索引)。

以上是关于在groupby之后访问pandas中的分层列的主要内容,如果未能解决你的问题,请参考以下文章

在csv,pandas中的groupby之后创建自定义列

如何使用 groupby 调整 pandas 中的小计列?

使用 apply() 函数在 pandas 中的 groupby 之后创建列表

Pandas - 在groupby之后将列转换为新行

如何在单个列上使用 groupby 并对 Pandas 中的多个列进行比较?

pandas.groupby中的迭代