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

我正在尝试基于分组数据框中的两列在 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')]

输出:

http://img1.mukewang.com/6140a17400015fb305070185.jpg

到目前为止,我在 Python 中尝试了以下操作:


import pandas as pd


df = 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']))

输出:

http://img1.mukewang.com/6140a17f0001962b04780115.jpg

当我将apply上面的代码更改为transform出现错误时:TypeError: an integer is required


转换工作正常,如果我只使用一列:


import pandas as pd


df = 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))

但显然,这不是同一个答案:

http://img.mukewang.com/6140a18c0001c94a02260260.jpg

有没有办法从 Pandas 中的 data.table 代码中获取结果而不必生成中间列(因为它然后我可以transform在最后一列上使用?

非常感谢任何帮助:)


Smart猫小萌
浏览 281回答 3
3回答

撒科打诨

只是使用 修复您的代码map,R并且pandas仍然有不同,这意味着并非R您可以在其中找到每个函数的替代品pandasdf.c.map(df.groupby(['c'])['a', 'b'].apply(lambda x: sum(x['a'])/sum(x['b'])))Out[67]: 0    0.2941181    0.2941182    0.2941183    0.2941184    0.4782615    0.478261Name: c, dtype: float64

九州编程

你就差一步了。v = df.groupby('c')[['a', 'b']].transform('sum')df['ab_weighted'] = v.a / v.bdf   a   b  c  ab_weighted0  1   7  q     0.2941181  2   8  q     0.2941182  3   9  q     0.2941183  4  10  q     0.2941184  5  11  w     0.4782615  6  12  w     0.478261
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python