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指出的问题。它看起来很简单,很优雅,但还不是很时髦。嗯,对我有用。