在pandas中groupby后访问层次化列

6 投票
1 回答
4564 浏览
提问于 2025-04-18 09:31

我在使用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']),这会得到一个视图或副本(我不太确定是哪种),里面实际上包含了两列,然后又对 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

(如果你想混合使用标签、loc和位置,iloc,你需要用到ix)

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

*这就是一个MultiIndex。

撰写回答