Pandas dataframe, как я могу сгруппировать по нескольким столбцам и применить сумму для определенного столбца и добавить новый столбец счета? - PullRequest
3 голосов
/ 21 ноября 2019

Учитывая данные кадра df1 следующим образом:

Col1    Col2    Col3    Col4    Col5
-------------------------------------
A       1       AA      10      Test1
A       1       AA      5       Test2
A       2       AB      30      Test3
B       4       FF      10      Test4
C       1       HH      4       Test7
C       3       GG      6       Test8
C       3       GG      7       Test9
D       1       AA      4       Test5
D       3       FF      6       Test6
  • Я хочу сгруппировать по Col1, Col2 и Col3 и

  • Добавить новыйКоличество столбцов: размер каждой группы

  • Добавить новый столбец Col4_sum: сумма каждого Col4 в каждой группе


Выходные данныенужно

Col1    Col2    Col3    Count   Col4_sum
----------------------------------------
A       1       AA      2       15
A       2       AB      1       30
B       4       FF      1       10
C       1       HH      1       4
C       3       GG      2       13
D       1       AA      1       4
D       3       FF      1       6

Я пытаюсь использовать

df1.groupby(['Col1','Col2','Col3']).size 

, но получаю только столбец Count.

Ответы [ 6 ]

5 голосов
/ 21 ноября 2019

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

df = (df1.groupby(['Col1','Col2','Col3'])['Col4']
         .agg([('Count','size'), ('Col4_sum','sum')])
         .reset_index())
print (df)
  Col1  Col2 Col3  Count  Col4_sum
0    A     1   AA      2        15
1    A     2   AB      1        30
2    B     4   FF      1        10
3    C     1   HH      1         4
4    C     3   GG      2        13
5    D     1   AA      1         4
6    D     3   FF      1         6

В пандах 0.25+ возможно использование named aggregation:

df = (df1.groupby(['Col1','Col2','Col3'])
         .agg(Count=('Col5', 'size'), Col4_sum=('Col4', 'sum'))
         .reset_index())
print (df)
  Col1  Col2 Col3  Count  Col4_sum
0    A     1   AA      2        15
1    A     2   AB      1        30
2    B     4   FF      1        10
3    C     1   HH      1         4
4    C     3   GG      2        13
5    D     1   AA      1         4
6    D     3   FF      1         6
2 голосов
/ 21 ноября 2019

Вы можете использовать слова имен столбцов и функции агрегирования. Смотри https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.aggregate.html

>>> df = pd.DataFrame([[1, 2, 3],
...                    [4, 5, 6],
...                    [7, 8, 9],
...                    [np.nan, np.nan, np.nan]],
...                   columns=['A', 'B', 'C'])
>>> df.agg({'A' : ['sum', 'min'], 'B' : ['min', 'max']})
#         A    B
# max   NaN  8.0
# min   1.0  2.0
# sum  12.0  NaN
0 голосов
/ 21 ноября 2019

Вы можете использовать функцию pivot_table:

df = pd.pivot_table(df, index=['Col1', 'Col2', 'Col3'], values='Col4', aggfunc=['count', 'sum']).reset_index()
df.columns = ['Col1', 'Col2', 'Col3', 'Count', 'Col4_sum']

Выход:

  Col1  Col2 Col3  Count  Col4_sum
0    A     1   AA      2        15
1    A     2   AB      1        30
2    B     4   FF      1        10
3    C     1   HH      1         4
4    C     3   GG      2        13
5    D     1   AA      1         4
6    D     3   FF      1         6
0 голосов
/ 21 ноября 2019

С помощью функции agg и словаря вы можете настроить свой вывод следующим образом:

df.groupby(['Col1','Col2','Col3']).agg({'Col3': ['count'], 'Col4': ['count','sum']})

Это должно вернуть группу для Col1, Col2 и Col3, агрегируя счет для Col3, а затемколичество и сумма для Col4

0 голосов
/ 21 ноября 2019

Это должно решить вашу проблему.

df2 = df.groupby(['Col1','Col2','Col3'])['Col4'].agg('sum')
0 голосов
/ 21 ноября 2019

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

df = df1.assign(Count=df1.groupby(['Col1','Col2','Col3']).Col4.transform('size'))
        .assign(Col4_sum=df1.groupby(['Col1','Col2','Col3']).Col4.transform('sum'))
        .reset_index()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...