有關groupby.apply的用法請教
老師好 我希望可以在data frame當中進行groupby之後加總的計算,類似R語言當中group by之後做mutate 例如原始的data frame長這樣 ![image](http://kwassistfile.cupoy.com/0000017D2DAB6DF80000000B6375706F795F72656C656173655155455354/1635308523626/large) 我想要groupby a、b這兩個欄位之後新增出c、d欄位相乘的加總 如果用R語言來寫的話會長這樣 ![image](http://kwassistfile.cupoy.com/0000017D2DAB6DF80000000B6375706F795F72656C656173655155455354/1635308523627/large) 並獲得下列成果 ![image](http://kwassistfile.cupoy.com/0000017D2DAB6DF80000000B6375706F795F72656C656173655155455354/1635308523628/large) 同一個group的row會有同樣的值 我在網路上有找到這樣的寫法,感覺很類似 df['ratio'] = df.groupby(['a','b'], group_keys=False)\ .apply(lambda g: g.c/(g.c * g.d).sum()) 但如果想要單純c、d欄位相乘的加總,就會報錯 df['ratio'] = df.groupby(['a','b'], group_keys=False)\ .apply(lambda g: (g.c * g.d).sum()) ![image](http://kwassistfile.cupoy.com/0000017D2DAB6DF80000000B6375706F795F72656C656173655155455354/1635308523629/large) 應該是因為這樣列數會跟原始的data frame不相同 因為希望可以mutate那樣直接得出想要的新欄位 所以想試試看可以不要用merge回去的方式 想請問是不是哪裡寫錯了或是可以怎麼寫來達成目的? 謝謝
回答列表
-
2021/11/18 上午 10:26Wells Lu贊同數:0不贊同數:0留言數:0
如果不用merge的話,我會這樣寫,但是要分成兩行。 ```python f['ratio'] = df.apply(lambda x: x.c*x.d, axis=1) f['ratio'] = df.groupby(['a','b'], asindex=False)['ratio'].transform('sum') ``` 至於哪裡寫錯,我會把apply在運行時想成他是一列一列做的,所以你在做index=0那一列時,他是看不到0以外的其他列,或是你可以寫一個def,然後在def中拉進外在的變數。 像這樣: ```python def measure_ratio(df_col): df2 = df.loc[df['a']==df_col['a']].loc[df['b']==df_col['b']] df2['c*d'] = df2['c'] * df2['d'] return sum(df2['c*d']) df['ratio'] = df.apply(measure_ratio, axis=1) ```