【发布时间】:2020-04-04 23:37:13
【问题描述】:
Pandas 0.25 版通过函数agg 和namedtuples 支持“命名聚合”。您需要按照doc 的描述传递列、聚合器对。它还说:
如果您的聚合函数需要额外的参数,请使用 functools.partial() 部分应用它们。
我想应用这个原则来获得加权平均值(除了简单的计数和平均值)。 我的输入表是
import pandas as pd
t = pd.DataFrame({'bucket':['a', 'a', 'b', 'b', 'b'], 'weight': [2, 3, 1, 4, 3],
'qty': [100, 500, 200, 800, 700]})
我的查询失败:
import functools
import numpy as np
t.groupby('bucket').agg(
NR= ('bucket', 'count'),
AVG_QTY= ('qty', np.mean),
W_AVG_QTY= ('qty', functools.partial(np.average, weights='weight'))
)
带有错误消息:
TypeError: 1D weights expected when shapes of a and weights differ.
我认为问题来自于将参数固定为另一列而不是常量?如果没有使用 apply 和返回 Series 的 lambda 表达式的解决方法,我该如何完成这项工作?
【问题讨论】:
-
IIUC,您需要将
group['weight']传递给np.average,而不是字符串。 -
究竟如何?你能提供确切的语法吗?
-
问题是
GroupBy.agg作用于单个列,但是加权平均需要 2 个单独的列;一个用于值,另一个用于权重。在这种情况下,GroupBy.apply是必需的,因为您可以传递 DataFrame。
标签: python pandas group-by functools