【问题标题】:Get elementwise mean of a multi-Index pandas dataframe获取多索引熊猫数据框的元素平均值
【发布时间】:2023-04-07 12:59:01
【问题描述】:

我创建了一个 multiIndex 数据框,如下所示:

df= 
            var0  var1  var2  var3  var4 ... var137
    0   0    10    2     0     5     1    ...  9  
        1    40    2     3     4     13   ...  7  
        2    60    3     5     6     3    ...  10
        ...
        111  0    1      1     0     2    ...  0
    1   0    1    20     10    5     1    ...  0  
        1    4    20     13    4     10   ...  3  
        2    6    30     15    6     1    ...  1
        ...
        111  0    1      1     0     2    ...  1
    2   0    0    2      0     5     16   ...  9  
        1    0    12     83    34    13   ...  17  
        2    0    30     56    66    3    ...  10
        ...
        111  0    1      1     0     2    ...  0
    ... 
    9   0    0    2      0     5     16   ...  9  
        1    0    12     83    34    13   ...  17  
        2    0    30     56    66    3    ...  10
        ...
        111  0    1      1     0     2    ...  1

这是我生成此数据框的方式:

frames = []
col_names = list()
col_names += [('var%d' % (j )) for j in range(112)]
for i in range(0, 10):
    result = get_results(...)
    df_tmp = pd.DataFrame(data=results, columns=col_names)
    frames.append(df_tmp)
df = pd.concat(frames, axis=0, keys=range(0, 112))

我需要通过以下方式获得平均值:

        var0                var1              var2  var3  ... var137
    0   (10+1+0+...)/10    (2+20+2+...)/10       ...          (9+0+9+...)/10
    1   (40+4+0+...)/10    (2+20+12+...)/10      ...          (7+3+17+...)/10  
    2   (60+6+0+...)/10    (3+30+30+...)/10      ...          (10+1+10+...)/10
    ...
    111     ...

因此结果是一个形状为 (112, 138) 的 2D 表格。 df.values.mean(axis=1)df.values.mean(axis=0) 将返回所有列/行的平均值,这不是我需要的。我怎么能理解这个意思?

【问题讨论】:

    标签: python pandas dataframe multi-index


    【解决方案1】:

    你可以试试meanlevel=1

    df.mean(level=1)
    Out[170]: 
              var0       var1       var2  var3       var4    var137
    2                                                              
    0     3.666667   8.000000   3.333333   5.0   6.000000  6.000000
    1    14.666667  11.333333  33.000000  14.0  12.000000  9.000000
    2    22.000000  21.000000  25.333333  26.0   2.333333  7.000000
    111   0.000000   1.000000   1.000000   0.0   2.000000  0.333333
    

    【讨论】:

    • 您的回答是正确的,谢谢。但是您能告诉我将级别设置为 1 是什么意思吗?
    • @Birish 得到第 1 级的平均值,你可以考虑 df.groupby(level=1).mean() 他们都产生相同的结果