Python: суммирование и агрегирование групп и подгрупп в DataFrame - PullRequest
1 голос
/ 13 апреля 2019

Я пытаюсь создать таблицу, в которой есть группы, разделенные на подгруппы с количеством и средним значением для каждой подгруппы. Например, я хочу преобразовать следующий фрейм данных:

Для таблицы, которая выглядит следующим образом, где интервал представляет собой большую группу, а столбцы через i становятся подгруппами в группе с соответствующим количеством подгрупп и средним значением в каждой ячейке. :

Я пробовал это безуспешно:

Ответы [ 3 ]

2 голосов
/ 13 апреля 2019

Try.

df.groupby(['interval']).apply(lambda x : x.stack()
                                           .groupby(level=-1)
                                           .agg({'count', 'mean'}))

Используйте groupby с apply, чтобы применить функцию для каждой группы, затем stack и groupby снова с agg, чтобы найти count и mean.

0 голосов
/ 20 апреля 2019

Следующий код решает проблему, о которой я просил:

df.group(['interval'],,as_index=False).agg({
                                                'a':{"count":"mean"},
                                                'b':{"count":"mean"},
                                                'c':{"count":"mean"},
                                                'd':{"count":"mean"},
                                                'f':{"count":"mean"},
                                                'g':{"count":"mean"},
                                                'i':{"count":"mean"}
                                            })
0 голосов
/ 14 апреля 2019

Используйте DataFrame.melt с GroupBy.agg и кортежи для агрегатных функций с именами новых столбцов:

df1 = (df.melt('interval', var_name='source')
         .groupby(['interval','source'])['value']
         .agg([('cnt','count'), ('average','mean')])
         .reset_index())
print (df1.head())
  interval source  cnt  average
0        0      a    1      5.0
1        0      b    1      0.0
2        0      c    1      0.0
3        0      d    1      0.0
4        0      f    1      0.0
...