Pandas Группировать по среднему и первый из нескольких столбцов - PullRequest
1 голос
/ 08 мая 2020
My Pandas df is like following and want to apply groupby and then want to calculate the average and first of many columns

index col1   col2   col3   col4   col5  col6
  0     a      c      1      2      f    5
  1     a      c      1      2      f    7
  2     a      d      1      2      g    9
  3     b      d      6      2      g    4
  4     b      e      1      2      g    8
  5     b      e      1      2      g    2

что-то вроде этого Я пробовал

df.groupby(['col1','col5').agg({['col6','col3']:'mean',['col4','col2']:'first'})

ожидая вывода

col1  col5   col6  col3  col4  col2
  a     f     6     1     2     c
  a     g     9     1     2     d
  b     g     4     3     2     e

но, похоже, список здесь не вариант, в моем реальном наборе данных у меня 100 из столбцы разного характера, поэтому я не могу передать их по отдельности. Есть мысли передать их в виде списка?

Ответы [ 3 ]

4 голосов
/ 08 мая 2020

если у вас есть списки в зависимости от агрегирования, вы можете сделать:

l_mean = ['col6','col3']
l_first = ['col4','col2']
df.groupby(['col1','col5']).agg({**{col:'mean' for col in l_mean},
                                 **{col:'first' for col in l_first}})

нотация **{} предназначена для распаковки словаря, выполняя {**{}, **{}} создание одного словаря из 2 словарей (это может быть чем два), это как объединение словарей. И выполнение {col:'mean' for col in l_mean} создает словарь с каждым col списка в качестве ключа и 'mean' в качестве значения, это понимание словаря.

Или используя concat:

gr = df.groupby(['col1','col5'])
pd.concat([gr[l_mean].mean(), 
           gr[l_first].first()], 
          axis=1)

и reset_index после, чтобы получить ожидаемый результат

0 голосов
/ 08 мая 2020

это расширение решения @ Ben.T, просто заключив его в функцию и передав его через метод pipe :

#set the list1, list2 
def fil(grp,list1,list2):
    A = grp.mean().filter(list1)
    B = grp.first().filter(list2)
    C = A.join(B)
    return C

grp1 = ['col6','col3']
grp2 = ['col4','col2']
m = df.groupby(['col1','col5']).pipe(fil,grp1,grp2)
m
0 голосов
/ 08 мая 2020
(
    df.groupby(['col1','col5'])
    .agg(col6=('col6', 'mean'),
        col3=('col3', 'mean'),
        col4=('col4', 'first'),
        col2=('col2', 'first'))
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...