Pandas groupby 使用自定义函数和pandas中的几个列进行聚合
假设我有以下数据框:Pandas groupby 使用自定义函数和pandas中的几个列进行聚合,pandas-groupby,transform,aggregation,summarization,Pandas Groupby,Transform,Aggregation,Summarization,假设我有以下数据框: group num value a 3 20 a 5 5 b 5 10 b 10 5 b 2 25 现在,我想计算列num和value的加权平均值,按列group分组。使用R中的包,这很简单: > library(tidyverse) > df <- tribble( ~group , ~num , ~value, "a" , 3
group num value
a 3 20
a 5 5
b 5 10
b 10 5
b 2 25
现在,我想计算列num
和value
的加权平均值,按列group
分组。使用R中的包,这很简单:
> library(tidyverse)
> df <- tribble(
~group , ~num , ~value,
"a" , 3 , 20,
"a" , 5 , 5,
"b" , 5 , 10,
"b" , 10 , 5,
"b" , 2 , 25
)
> df %>%
group_by(group) %>%
summarise(new_value = sum(num * value) / sum(num))
# A tibble: 2 x 2
group new_value
<chr> <dbl>
1 a 10.6
2 b 8.82
请注意,我们明确需要首先对感兴趣的列进行子集([[“num”,“tmp_value”]]
),计算总和(sum()
),然后使用transform()
计算平均值/除法。在R中,我们只在一个简单的步骤中编写,更加紧凑和可读,IMHO
现在,我怎样才能用熊猫来实现这种优雅呢?换句话说,它是否能像我们在R中所做的那样更干净、更优雅、更易于阅读?@an_drade-有一个非常类似的stackoverflow问题提供了解决方案: 您的问题的解决方案基于上面的帖子,创建了一个python函数:
df=pd.DataFrame([['a',3,20],['a',5,5],['b',5,10],['b',10,5],['b',2,25]],columns=['group','num','value'])
def wavg(group):
d = group['num']
w = group['value']
return (d*w).sum() / d.sum()
final=df.groupby("group").apply(wavg)
group
a 10.625000
b 8.823529
dtype: float64
这是您想要的“R方式”:
来自数据导入f的>>
>>>从datar.tibble导入tribble
>>>从datar.dplyr导入组_by,总结
>>>从datar.base导入和
>>>#或者如果你懒惰:
>>>#从datar.all导入*
>>>
>>>df=tribble(
…f.group,f.num,f.value,
…“a”、3、20、,
…“a”,5,5,
…b、5、10、,
…b、10、5、,
…“b”,2,25
... )
>>>df>>\
... 分组依据(f组)>>\
... 总结(新值=总和(f.num*f.value)/总和(f.num))
组新值
0 a 10.625000
1 b 8.823529
我是这个包裹的作者。如果您对使用它有任何疑问,请随时提交问题。感谢@Newbie123指出的问题。它看起来很简单,很优雅,但还不是很时髦。嗯,对我有用。