pandas - 使用 MultiIndex 从 Pandas 面板中选择数据

标签 pandas multi-index

我有一个 DataFrame使用 MultiIndex,例如:

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()

我不确定面板 - 它没有很好的记录,但应该有类似的东西

关于pandas - 使用 MultiIndex 从 Pandas 面板中选择数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11720334/

相关文章:

python - 无法查看 Pandas 数据框中的所有列

python - MultiIndex DataFrame 中基于现有列级别值的新级别

python - pandas 添加更高级别的列多重索引

python - 多列作为多索引数据框中每个级别的索引

python - 在 pandas DataFrame 中删除列级别的方法链接解决方案

python - 使用python删除pandas DataFrame中的子字符串

python Pandas : categorize/bin by numeric groupings with zero values

python - 使用 countvectorizer() 和 tfidfvectorizer() 向量化列表列表

python - Pandas:每月制作 DataFrame 切片

python - groupby - python Pandas 数据框