MultiIndex数据框的均值

时间:2019-02-21 17:24:19

标签: python pandas multi-index

我有以下数据框

                 A     B    C    D    E    F
Algo     T                                   
X        1     0.2   0.2  0.0  0.0  0.2   0.2
         2     0.0   0.0  0.0  0.0  0.0   0.0
Y        15    0.7   1.4  1.5  1.0  0.7   1.4
         30    0.5   0.3  1.0  0.4  0.5   0.4
         45    0.2   0.0  0.6  0.0  0.2   0.0
Z        30    1.8   2.3  0.6  0.7  1.8   2.3
         60    1.0   0.5  0.3  0.4  1.0   0.5
         90    0.3   0.2  0.0  0.2  0.4   0.2

我想知道如何在底部显示一行,以显示A,B,C,... F列的平均值。

                 A     B    C    D    E    F
Algo     T                                   
X        1     0.2   0.2  0.0  0.0  0.2   0.2
         2     0.0   0.0  0.0  0.0  0.0   0.0
Y        15    0.7   1.4  1.5  1.0  0.7   1.4
         30    0.5   0.3  1.0  0.4  0.5   0.4
         45    0.2   0.0  0.6  0.0  0.2   0.0
Z        30    1.8   2.3  0.6  0.7  1.8   2.3
         60    1.0   0.5  0.3  0.4  1.0   0.5
         90    0.3   0.2  0.0  0.2  0.4   0.2
Mean           ...   ...  ...  ...  ...   ...

2 个答案:

答案 0 :(得分:3)

您可以使用.loc来分配均值行。 MultiIndex的值是元组,因此应进行相应分配:

df.loc[('Mean', ''), :] = df.mean()

输出:

              A       B    C       D    E      F
Algo T                                          
X    1   0.2000  0.2000  0.0  0.0000  0.2  0.200
     2   0.0000  0.0000  0.0  0.0000  0.0  0.000
Y    15  0.7000  1.4000  1.5  1.0000  0.7  1.400
     30  0.5000  0.3000  1.0  0.4000  0.5  0.400
     45  0.2000  0.0000  0.6  0.0000  0.2  0.000
Z    30  1.8000  2.3000  0.6  0.7000  1.8  2.300
     60  1.0000  0.5000  0.3  0.4000  1.0  0.500
     90  0.3000  0.2000  0.0  0.2000  0.4  0.200
Mean     0.5875  0.6125  0.5  0.3375  0.6  0.625

如果您想为每个组分别取平均值,请进行串联。在这里,我们可以使用.agg指定一个列表,然后使用stack来获得我们需要的MultiIndex,而无需进行很多手动操作。现在,您可以泛化为多个聚合函数.agg(['mean', 'std', 'size']),它将在T索引级别添加所有具有agg函数的聚合函数。

import pandas as pd
pd.concat([df, df.groupby(level=0).agg(['mean']).stack(1)])

                  A         B         C         D         E    F
Algo T                                                          
X    1     0.200000  0.200000  0.000000  0.000000  0.200000  0.2
     2     0.000000  0.000000  0.000000  0.000000  0.000000  0.0
Y    15    0.700000  1.400000  1.500000  1.000000  0.700000  1.4
     30    0.500000  0.300000  1.000000  0.400000  0.500000  0.4
     45    0.200000  0.000000  0.600000  0.000000  0.200000  0.0
Z    30    1.800000  2.300000  0.600000  0.700000  1.800000  2.3
     60    1.000000  0.500000  0.300000  0.400000  1.000000  0.5
     90    0.300000  0.200000  0.000000  0.200000  0.400000  0.2
X    mean  0.100000  0.100000  0.000000  0.000000  0.100000  0.1
Y    mean  0.466667  0.566667  1.033333  0.466667  0.466667  0.6
Z    mean  1.033333  1.000000  0.300000  0.433333  1.066667  1.0

答案 1 :(得分:2)

如果您确定实际上要在同一df中包含一行作为平均值,则可以:

  1. 获取平均值的pd系列。

  2. 给它一个符合MultiIndex的名称。

  3. 将其附加到数据框。

    df = df.append(df.mean().rename(('Mean', '')))