Pandas返回列表的聚合函数报Must produce aggregated value错误原因
问题原因
这个报错的核心触发点是A=2400分组对应的val列全是空列表,你的自定义聚合函数处理该分组后返回了空列表,触发了pandas的聚合结果校验逻辑:
- pandas的
groupby.agg会对返回结果做有效性校验,当聚合返回的结果是空列表这类长度为0的对象时,会被判定为没有生成有效的聚合值,因此抛出ValueError: Must produce aggregated value。 - 你之前返回列表的聚合能正常运行,是因为之前所有分组的聚合返回结果都是非空列表,没有触发这条校验规则。
解决方法
方法1:改用groupby.apply完成聚合
apply的校验逻辑比agg宽松,天然支持返回列表作为分组聚合结果:
from itertools import chain def _flattened_set(list_list_elements): return list(set(chain.from_iterable(list_list_elements))) result = df.groupby(level=0)['val'].apply(_flattened_set).to_frame()
运行后即可得到符合预期的结果。
方法2:修改聚合函数返回结构兼容agg校验
如果一定要使用agg,可以把返回的列表外层用一个元组包裹,绕过pandas的长度校验,使用时再做提取即可:
def _flattened_set(list_list_elements): res = list(set(chain.from_iterable(list_list_elements))) return (res,) # 用元组包裹避免触发空值校验 result = df.groupby(level=0).aggregate({'val': _flattened_set}) # 可选:把元组拆开恢复列表结构 result['val'] = result['val'].str[0]
内容的提问来源于stack exchange,提问作者Iván Sánchez
相关产品推荐
相关产品推荐

