为了账号安全,请及时绑定邮箱和手机立即绑定

将 groupby 结果广播为原始 DataFrame 中的新列

将 groupby 结果广播为原始 DataFrame 中的新列

Smart猫小萌 2021-09-14 21:19:21
我正在尝试基于分组数据框中的两列在 Pandas 数据框中创建一个新列。具体来说,我正在尝试复制此 R 代码的输出:library(data.table)df = data.table(a = 1:6,             b = 7:12,            c = c('q', 'q', 'q', 'q', 'w', 'w')            )df[, ab_weighted := sum(a)/sum(b), by = "c"]df[, c('c', 'a', 'b', 'ab_weighted')]输出:到目前为止,我在 Python 中尝试了以下操作:import pandas as pddf = pd.DataFrame({'a':[1,2,3,4,5,6],               'b':[7,8,9,10,11,12],               'c':['q', 'q', 'q', 'q', 'w', 'w']              })df.groupby(['c'])['a', 'b'].apply(lambda x: sum(x['a'])/sum(x['b']))输出:当我将apply上面的代码更改为transform出现错误时:TypeError: an integer is required转换工作正常,如果我只使用一列:import pandas as pddf = pd.DataFrame({'a':[1,2,3,4,5,6],               'b':[7,8,9,10,11,12],               'c':['q', 'q', 'q', 'q', 'w', 'w']              }) df.groupby(['c'])['a', 'b'].transform(lambda x: sum(x))但显然,这不是同一个答案:有没有办法从 Pandas 中的 data.table 代码中获取结果而不必生成中间列(因为它然后我可以transform在最后一列上使用?非常感谢任何帮助:)
查看完整描述

3 回答

?
撒科打诨

TA贡献1934条经验 获得超2个赞

只是使用 修复您的代码map,R并且pandas仍然有不同,这意味着并非R您可以在其中找到每个函数的替代品pandas


df.c.map(df.groupby(['c'])['a', 'b'].apply(lambda x: sum(x['a'])/sum(x['b'])))

Out[67]: 

0    0.294118

1    0.294118

2    0.294118

3    0.294118

4    0.478261

5    0.478261

Name: c, dtype: float64


查看完整回答
反对 回复 2021-09-14
?
九州编程

TA贡献1785条经验 获得超4个赞

你就差一步了。


v = df.groupby('c')[['a', 'b']].transform('sum')

df['ab_weighted'] = v.a / v.b


df

   a   b  c  ab_weighted

0  1   7  q     0.294118

1  2   8  q     0.294118

2  3   9  q     0.294118

3  4  10  q     0.294118

4  5  11  w     0.478261

5  6  12  w     0.478261


查看完整回答
反对 回复 2021-09-14
  • 3 回答
  • 0 关注
  • 280 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号