在 pandas 中使用 groupby 后访问层次列

6

我使用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 列的切片。

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

1个回答

9
建议一次性完成这些操作(避免链接),尤其是能够进行赋值操作(而不是将修改赋给视图,最终被垃圾回收)。
将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
< p >(要混合使用标签、位置loc和iloc,您必须使用ix)

(要在标签、位置loc和iloc之间进行混合,必须使用ix)
In [13]: df.ix[0, ('col1', 'mean')]
Out[13]: 1.3840520000000001

*这是一个多重索引。


非常感谢。是的,我对避免链式操作的假设是正确的。谢谢您澄清这些实际上是所谓的多重索引;我原以为这个名称只适用于行中的多重索引...但我看到了类比,特别是因为一个DataFrame可以很容易地转置(从而仍然保持MultiIndex)。 - tim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接