Pandas可链式加权平均计算

2024-04-20 09:59:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我对Pandas还不熟悉,我想将下面的简单R代码转换成Pandas来计算一列的平均值和加权平均值(实际上,还有更多的列需要聚合)。解决方案必须是可链接的,因为计算前后都有多个步骤。我已经研究了使用apply函数(Calculate weighted average using a pandas/dataframe)的解决方案,但是看起来要么必须在apply函数内部执行完全聚合步骤(对所有可能不相关的列),我发现这很难看,要么分别计算平均值和加权平均值,然后再执行表联接。在大熊猫身上,最先进的方法是什么?你知道吗

df = data.frame(batch=c("A", "A", "B", "B", "C","C"), value=1:6, weight=1:6)
df %>% 
  group_by(batch) %>% 
  summarise(avg = mean(value), avg_weighted = sum(value*weight)/sum(weight))

# A tibble: 3 x 3
  batch   avg avg_weighted
  <chr> <dbl>        <dbl>
1 A       1.5         1.67
2 B       3.5         3.57
3 C       5.5         5.55

我的熊猫尝试:

df2 = pd.DataFrame({'batch': ["A", "A", "B", "B", "C", "C"], 'value':[1,2,3,4,5,6], 'weight':[1,2,3,4,5,6]})

def agg_step(grp):
    return pd.DataFrame({'avg':[grp['value'].mean()], 
          'avg_weighted':np.average(grp['value'], weights=grp['weight'])})

(df2.
    groupby('batch')
    .apply(agg_step)
    .reset_index()
    .drop(columns='level_1')
)

Out[93]: 
  batch  avg  avg_weighted
0     A  1.5      1.666667
1     B  3.5      3.571429
2     C  5.5      5.545455

Tags: 函数pandasdfvaluebatch步骤解决方案mean