groupby в пользовательской функции python, не работает - PullRequest
1 голос
/ 07 марта 2019

Я сделал свою собственную пользовательскую функцию в Python.Входными данными являются некоторые параметры и датафрейм.Сначала некоторые новые переменные добавляются во входной фрейм данных.Затем я пытаюсь сгруппировать данные на фрейме данных и оставил присоединение результата к фрейму данных.

Но на фрейме данных не добавляются переменные группировки.

 def test(df, params):

    df['b']=df['a']*params['some_parameter']
    df['c']=df['b']*df['total']

    aaa=df.groupby(['aa', 'bb']).agg({'c':'sum'})
    df=pd.merge(df,a,how='left',on=['aa', 'bb'])

    return 

Следующая попытка:

def test(df, params):

df['b']=df['a']*params['some_parameter']
df['d']=df['c']*df['b']

aaa=df.groupby(['y','x']).agg({'d':'sum','g':'sum'}).add_suffix('_sum')
df=df.join(aaa, on=['y','x'])    

return   

Затем я вызываю функцию с помощью: test (df2, params)

Я ожидаю, что df2 будет иметь 4 новых столбца, b, d, d_sum и g_sum.Но в нем только 2 новых столбца, b и d.

1 Ответ

0 голосов
/ 07 марта 2019

Вы можете использовать GroupBy.transform вместо groupby с левым соединением merge:

aaa=df.groupby(['aa', 'bb']).agg({'c':'sum'})
df=pd.merge(df,a,how='left',on=['aa', 'bb'])

до:

df['c1'] = df.groupby(['aa', 'bb'])['c'].transform('sum')

Все вместе:

def test(df, params):

    df['b']=df['a']*params['some_parameter']
    df['c']=df['b']*df['total']

    df['new'] = df.groupby(['aa', 'bb'])['c'].transform('sum')

    return df

Если необходимо объединить несколько столбцов, используйте DataFrame.join с левым соединением по умолчанию:

df = pd.DataFrame({
         'x':list('dddddd'),
         'y':list('aaabbb'),
         'a':[4,5,4,5,5,4],
         'b':[7,8,9,4,2,3],
         'c':[1,3,5,7,1,0],
         'd':[5,3,6,9,2,4],
         'g':[1,3,6,4,4,3],
})

print (df)
   x  y  a  b  c  d  g
0  d  a  4  7  1  5  1
1  d  a  5  8  3  3  3
2  d  a  4  9  5  6  6
3  d  b  5  4  7  9  4
4  d  b  5  2  1  2  4
5  d  b  4  3  0  4  3

params = {'some_parameter':100}

def test(df, params):

    df['b']=df['a']*params['some_parameter']
    df['d']=df['c']*df['b']

    aaa=df.groupby(['y','x']).agg({'d':'sum','g':'sum'}).add_suffix('_sum')
    df=df.join(aaa, on=['y','x'])    

    return df

df1 = test(df, params)
print (df1)
   x  y  a    b  c     d  g  d_sum  g_sum
0  d  a  4  400  1   400  1   3900     10
1  d  a  5  500  3  1500  3   3900     10
2  d  a  4  400  5  2000  6   3900     10
3  d  b  5  500  7  3500  4   4000     11
4  d  b  5  500  1   500  4   4000     11
5  d  b  4  400  0     0  3   4000     11
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...