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

Pandas多列分组后用map赋值全为NaN,求正确实现方法

解决Pandas多列分组后创建新列的问题

我来帮你搞定这个问题!你遇到的new列全是NaN的情况,核心原因是你用单字段user_id去匹配多列复合索引的分组结果——分组后的Series索引是(user_id, area_id, group_id, year)的组合键,仅用user_id根本找不到对应匹配项,所以全返回NaN。

下面给你三种实用的解决方案,按需选择:

方法1:用merge(最直观易读)

先筛选出key=102的数据分组求和,再通过多列键合并回原DataFrame,最后填充缺失值:

# 1. 筛选key=102的数据,按多列分组求和并重置索引
sum_df = df[df['key'].eq(102)].groupby(['user_id', 'area_id', 'group_id', 'year'])['value'].sum().reset_index(name='new')

# 2. 用多列作为连接键合并到原表,左连接保留所有行,缺失值填充0
df = df.merge(sum_df, on=['user_id', 'area_id', 'group_id', 'year'], how='left').fillna(0)

方法2:用groupby.transform(简洁高效,原地修改)

利用transform的广播特性,在每个分组内直接计算key=102的value总和,并同步到组内所有行:

df['new'] = df.groupby(['user_id', 'area_id', 'group_id', 'year'])['value'].transform(
    lambda x: x[df.loc[x.index, 'key'] == 102].sum()
)
# 把分组内没有key=102的NaN填充为0
df['new'] = df['new'].fillna(0)

方法3:用map结合元组(如果坚持想用map)

把原表的多列组合成元组作为匹配键,再用map去匹配分组后的复合索引:

# 1. 分组求和得到带复合索引的Series
sum_series = df[df['key'].eq(102)].groupby(['user_id', 'area_id', 'group_id', 'year'])['value'].sum()

# 2. 把原表的多列转成元组,用get方法匹配,无匹配则返回0
df['new'] = df.apply(
    lambda row: sum_series.get((row['user_id'], row['area_id'], row['group_id'], row['year']), 0),
    axis=1
)

这三种方法都能正确生成你需要的new列,其中方法2的性能最优,适合处理大数据量的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:35:25