用户定义的python函数中的groupby无效

时间:2019-03-07 12:19:16

标签: python pandas pandas-groupby

我用Python编写了自己的用户定义函数。输入是一些参数和一个数据框。首先,将一些新变量添加到输入数据框。然后,我尝试在数据框上进行分组,然后将结果连接到数据框上。

但是数据框没有添加groupby变量。

 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   

然后我通过以下方式调用该函数: 测试(df2,params)

我希望df2会有4个新列,即b,d,d_sum和g_sum。但是它只有2个新列,即b和d。

1 个答案:

答案 0 :(得分:0)

您可以将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