Pandas совокупная группировка и суммирование - PullRequest
1 голос
/ 04 августа 2020

У меня есть pandas фрейм данных, где я пытаюсь суммировать на основе группировок, но, похоже, я не могу правильно определить порядок. В приведенном ниже примере я хочу сгруппировать по group2, а затем group1 и суммировать без двойного подсчета значений group1. Это часть более крупной таблицы с другими происходящими событиями, поэтому я не хочу отфильтровывать по уникальным наборам группы 1-2.

Использование pandas 1.0.5

x, y = [(21643,21665,21640,21668,21713,21706), (30,28,84,2,32,-9)]
val = [11,27,31,15,50,35]
group1, group2 = [(1,1,3,4,1,4), (21660,21660,21660,21660,21700,21700)]

df = pd.DataFrame(list(zip(x, y, val, group1, group2)), 
                  columns =['x', 'y', 'val', 'group1', 'group2']
                 ) 

df.reset_index(drop=True, inplace=True)
df.sort_values(['group2', 'group1'],inplace=True)
df['group1_mean'] = df.groupby(['group2', 'group1'])['val'].transform('mean')
df['group2_sum'] = df.groupby(['group2', 'group1'])['group1_mean'].transform('sum')
display(df)

введите описание изображения здесь

Ответы [ 2 ]

2 голосов
/ 04 августа 2020

Я бы сделал временный df

dfsum = df.groupby(['group2', 'group1']).mean()
dfsum = dfsum.groupby('group2').sum()

Затем слейте df с этим dfsum

df = df.merge(dfsum, on='group2')

Однострочный трюк

df = df.merge(df.groupby(['group2', 'group1']).val.mean()
    .groupby('group2').sum().rename('result'), on='group2')

Это не приведет к присвоению нового имени переменной, поэтому промежуточные dfs groupby будут собираться мусором.

Вывод

       x   y  val  group1  group2  result
0  21643  30   11       1   21660      65
1  21665  28   27       1   21660      65
2  21640  84   31       3   21660      65
3  21668   2   15       4   21660      65
4  21713  32   50       1   21700      85
5  21706  -9   35       4   21700      85
0 голосов
/ 04 августа 2020

Другой способ без промежуточного фрейма данных:

df['group2_sum2']=df['group1_mean'].mask(df.duplicated(['group1','group2']), 0)\
                                   .groupby(df['group2']).transform('sum')

Вывод:

       x   y  val  group1  group2  group1_mean  group2_sum  group2_sum2
0  21643  30   11       1   21660           19          65           65
1  21665  28   27       1   21660           19          65           65
2  21640  84   31       3   21660           31          65           65
3  21668   2   15       4   21660           15          65           65
4  21713  32   50       1   21700           50          85           85
5  21706  -9   35       4   21700           35          85           85

IIU C,

df_mean_sums = df.drop_duplicates(['group2', 'group1'])\
                 .groupby('group2')['group1_mean'].sum()
df['group2_sum'] = df['group2'].map(df_mean_sums)
df

Вывод:

    x   y  val  group1  group2  group1_mean  group2_sum
0  21643  30   11       1   21660           19          65
1  21665  28   27       1   21660           19          65
2  21640  84   31       3   21660           31          65
3  21668   2   15       4   21660           15          65
4  21713  32   50       1   21700           50          85
5  21706  -9   35       4   21700           35          85
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...