You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas Groupby多自定义函数聚合时报[('price', '<lambda>')] not in index错误

问题原因

这是pandas 0.25.x版本的已知问题:该版本刚推出基于命名元组的agg聚合语法,对重复使用同一个匿名lambda函数处理不同列的场景存在识别bug,函数默认的__name__属性都是<lambda>,导致聚合后的MultiIndex出现重复键冲突,触发not in index报错。

解决方法

方法1:修改自定义函数的名称属性,避免键冲突

给两个用到的加权平均函数设置不同的名称标识,解决重复键问题:

import numpy as np
import pandas as pd

# 分别定义两个加权平均函数,设置不同的名称
wm_travel = lambda x: np.average(x, weights=res_df.loc[x.index, "trips"])
wm_travel.__name__ = "wm_travel"
wm_price = lambda x: np.average(x, weights=res_df.loc[x.index, "trips"])
wm_price.__name__ = "wm_price"

# 执行聚合
grp = res_df.groupby('price_per_time').agg(
    tot_trips=('trips', 'sum'),
    tot_price=('price', 'sum'), 
    sw=('sw', 'sum'), 
    mean_travel_time=('travel_time', wm_travel),
    mean_price=('price', wm_price)
).reset_index()

方法2:改用字典格式的聚合参数,绕开命名聚合的兼容问题

0.25版本对字典传参的聚合逻辑完全兼容,聚合后手动重命名列即可:

grp = res_df.groupby('price_per_time').agg({
    "trips": "sum",
    "price": ["sum", wm],
    "sw": "sum",
    "travel_time": wm
}).reset_index()

# 重命名多层列
grp.columns = [
    "price_per_time", "tot_trips", "tot_price", "mean_price", 
    "sw", "mean_travel_time"
]

方法3(更推荐):使用groupby.apply处理全分组逻辑

直接把每个分组的完整DataFrame传入自定义函数计算,不需要依赖全局的res_df索引匹配,稳定性更高:

def group_agg(group):
    return pd.Series({
        "tot_trips": group["trips"].sum(),
        "tot_price": group["price"].sum(),
        "sw": group["sw"].sum(),
        "mean_travel_time": np.average(group["travel_time"], weights=group["trips"]),
        "mean_price": np.average(group["price"], weights=group["trips"])
    })

grp = res_df.groupby('price_per_time').apply(group_agg).reset_index()

内容的提问来源于stack exchange,提问作者ron zuk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 06:06:03