Chr*_*oph 4 python group-by dataframe pandas pandas-groupby
我正在尝试基于分组数据框中的两列在 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')]
Run Code Online (Sandbox Code Playgroud)
输出:
到目前为止,我在 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']))
Run Code Online (Sandbox Code Playgroud)
输出:
当我将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))
Run Code Online (Sandbox Code Playgroud)
但显然,这不是同一个答案:
有没有办法从 Pandas 中的 data.table 代码中获取结果而不必生成中间列(因为它然后我可以transform在最后一列上使用?
非常感谢任何帮助:)
只是使用 修复您的代码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
Run Code Online (Sandbox Code Playgroud)
你还差一步。
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
Run Code Online (Sandbox Code Playgroud)