我有一个带有MultiIndex的DataFrame
,例如:
In [1]: arrays = [['one','one','one','two','two','two'],[1,2,3,1,2,3]]
In [2]: df = DataFrame(randn(6,2),index=MultiIndex.from_tuples(zip(*arrays)),columns=['A','B'])
In [3]: df
Out [3]:
A B
one 1 -2.028736 -0.466668
2 -1.877478 0.179211
3 0.886038 0.679528
two 1 1.101735 0.169177
2 0.756676 -1.043739
3 1.189944 1.342415
现在,我想为每一行(索引级别0)和每一列计算元素2和3(索引级别1)的均值。所以我需要一个看起来像的DataFrame
A B
one 1 mean(df['A'].ix['one'][1:3]) mean(df['B'].ix['one'][1:3])
two 1 mean(df['A'].ix['two'][1:3]) mean(df['B'].ix['two'][1:3])
在不使用原始数据帧的行(索引级别0)的循环的情况下该如何做?如果我想对面板做同样的事情怎么办? groupby必须有一个简单的解决方案,但我仍在学习它,想不出答案。
最佳答案
您可以使用xs功能选择关卡。
从...开始:
A B
one 1 -2.712137 -0.131805
2 -0.390227 -1.333230
3 0.047128 0.438284
two 1 0.055254 -1.434262
2 2.392265 -1.474072
3 -1.058256 -0.572943
然后,您可以使用以下方法创建新的数据框:
DataFrame({'one':df.xs('one',level=0)[1:3].apply(np.mean), 'two':df.xs('two',level=0)[1:3].apply(np.mean)}).transpose()
结果如下:
A B
one -0.171549 -0.447473
two 0.667005 -1.023508
要执行此操作而不指定级别中的项目,可以使用groupby:
grouped = df.groupby(level=0)
d = {}
for g in grouped:
d[g[0]] = g[1][1:3].apply(np.mean)
DataFrame(d).transpose()
我不确定面板-记录不充分,但类似的事情应该可行