在pandas中groupby后访问层次化列
我在使用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。