使用多索引从pandas面板中选择数据
我有一个带有多索引的使用多索引从pandas面板中选择数据,pandas,multi-index,Pandas,Multi Index,我有一个带有多索引的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 -
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)的平均值。所以我需要一个数据帧,它看起来像
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()
我不确定面板的情况-它没有很好的文档记录,但是类似的东西应该是可能的请执行以下操作:
# Specify the indices you want to work with.
idxs = [("one", elem) for elem in [2,3]] + [("two", elem) for elem in [2,3]]
# Compute grouped mean over only those indices.
df.ix[idxs].mean(level=0)
我知道这是一个老问题,但对于搜索和查找此页面的参考,我认为更简单的解决方案是
mean
中的level
关键字:
In [4]: arrays = [['one','one','one','two','two','two'],[1,2,3,1,2,3]]
In [5]: df = pd.DataFrame(np.random.randn(6,2),index=pd.MultiIndex.from_tuples(z
ip(*arrays)),columns=['A','B'])
In [6]: df
Out[6]:
A B
one 1 -0.472890 2.297778
2 -2.002773 -0.114489
3 -1.337794 -1.464213
two 1 1.964838 -0.623666
2 0.838388 0.229361
3 1.735198 0.170260
In [7]: df.mean(level=0)
Out[7]:
A B
one -1.271152 0.239692
two 1.512808 -0.074682
在这种情况下,表示0级保留在轴0上(行,默认值为
mean
)John,您的解决方案非常有用。尽管如此,我仍然必须逐个迭代级别0中的所有行。