Среднее мультикадрового фрейма данных - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть следующий фрейм данных

                 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 голосов
/ 21 февраля 2019

Если вы уверены, что действительно хотите иметь строку в одном и том же значении df для среднего, тогда вы можете:

  1. Получить pd.Series из средних значений.

  2. Дайте ему имя, которое будет соответствовать MultiIndex.

  3. Добавьте его в DataFrame.

    df = df.append(df.mean().rename(('Mean', '')))
    
0 голосов
/ 21 февраля 2019

Вы можете назначить среднюю строку, используя .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']), и это добавит все из них с функцией agg на уровне индекса T.

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
...