【问题标题】:selecting data from pandas panel with MultiIndex使用 MultiIndex 从 pandas 面板中选择数据
【发布时间】:2012-07-28 01:15:11
【问题描述】:

我有一个带有 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 一定有一个简单的解决方案,但我还在学习它,想不出答案。

【问题讨论】:

    标签: pandas multi-index


    【解决方案1】:

    您可以使用 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()
    

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

    【讨论】:

    • 约翰,您的解决方案非常有帮助。虽然,我仍然需要一一遍历级别 0 中的所有行。
    【解决方案2】:

    我知道这是一个老问题,但作为参考谁搜索并找到此页面,我认为更简单的解决方案是 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 的默认值)

    【讨论】:

      【解决方案3】:

      执行以下操作:

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

      【讨论】:

        猜你喜欢
        • 2019-12-02
        • 2013-08-30
        • 2017-08-10
        • 1970-01-01
        • 2019-05-24
        相关资源
        最近更新 更多