Multi-Groupby (итерация или применение функции) - PullRequest
0 голосов
/ 29 января 2019

Публикация, потому что я впервые не смог найти ответ на свою проблему.Я подошел близко, но без игры в кости.Я пытаюсь выполнить итерацию цикла или применить функцию к кадру данных pandas, который сгруппирован по двум столбцам, а данные, к которым я хочу получить, находятся в третьем столбце после группировки столбцов 1 и 2.

УчитываяПример данных:

df = pd.DataFrame({'Class':np.random.randint(1,10,100),'Type':np.random.choice(list('ABCD'),100),'Guid':np.random.randint(10000,99999,100)})

Если я использую

for name,group in df.groupby(['Class','Type']):
print(name)
print(group.Guid)

или

for name,group in df.groupby(['Class','Type'])['Guid']:
print(name)
print(group)

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

    (1, 'A')
86    86606
89    69999
Name: Guid, dtype: int32
(1, 'B')
0     71982
67    95343
68    84520
75    57036
87    61938
Name: Guid, dtype: int32
(1, 'C')
48    67008
Name: Guid, dtype: int32
(1, 'D')
4     87947
6     98477
13    78437
53    95792
76    66178
Name: Guid, dtype: int32
(2, 'A')
42    47960
Name: Guid, dtype: int32
(2, 'B')
30    69891
82    84436
91    54546
Name: Guid, dtype: int32
(3, 'A')
5     74182
19    12167
35    99939
78    38939
Name: Guid, dtype: int32
(3, 'B')
16    92239
27    25167
41    84245
47    43174
51    50472
Name: Guid, dtype: int32

Далее я хотел бы сделать несколько математических заданий или применить функцию к «Guid» в пределах его сгруппированных настроек, отличных от стандартного среднего, стандартного, счетного и т. Д.Они отлично работают, могут даже агрегировать их.

df.groupby(['Class','Type']).Guid.mean()
Class  Type
1      A       78302.500000
       B       74163.800000
       C       67008.000000
       D       85366.200000
2      A       47960.000000
       B       69624.333333
3      A       56306.750000
       B       59059.400000
       C       31237.000000
       D       61973.000000
4      A       36573.000000
       B       55441.250000
       C       49381.333333
       D       35420.000000
5      A       57252.500000
       B       59267.250000
       C       48885.000000
       D       62163.000000
6      A       43106.800000
       B       46767.500000
       C       23170.000000
       D       31663.000000
7      A       47804.750000
       B       61570.666667
       C       60989.666667
       D       57300.000000
8      A       55890.000000
       B       50629.000000
       D       26312.000000
9      A       13338.500000
       B       49556.000000
       C       66602.400000
       D       58603.500000
Name: Guid, dtype: float64

Но я не могу понять, как применить мою собственную математику или функцию к «Guid», когда она сгруппирована по [«Class»,'Тип'].Например, если бы я хотел посчитать, сколько раз значение в «Guid» изменилось более чем на 10000.

df.groupby(['Class','Type']).Guid.apply(function or maths here)
df.groupby(['Class','Type']).agg(['count','mean','std',somefunctionhere]).Guid

Любая помощь очень ценится!

1 Ответ

0 голосов
/ 29 января 2019

Вот пример того, как применить вашу собственную пользовательскую функцию:

import pandas as pd
import numpy as np

def myfunc(group):
    # You can do whatever you want to the group, just make sure it returns that grouping as dataframe
    group['guid_sum'] = group['Guid'].sum()
    return group

df = pd.DataFrame({'Class':np.random.randint(1,10,100),'Type':np.random.choice(list('ABCD'),100),'Guid':np.random.randint(10000,99999,100)})
group = df.groupby(['Class','Type'])
applied = group.apply(myfunc)
...