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
相关产品推荐
相关产品推荐

