Pandas分组聚合值添加新列时出现NaN问题求助
问题分析与解决
错误原因
你执行的代码中,df.groupby('prod')['quant'].sum()返回的是一个以prod的唯一值('A'、'B')作为索引的Series,而原DataFrame的索引是0-4的整数,两者索引不匹配,直接赋值时无法将分组求和结果对应到原DataFrame的每一行,因此新列added_gr全为NaN。
正确解法
方法一:使用transform(推荐)
transform方法会对每个分组执行聚合操作,并将结果广播到该分组的所有行,返回与原DataFrame长度一致的结果,自动匹配索引:
import pandas as pd df = pd.DataFrame({'prod':['A','A','A','B','B'],'quant':[2,3,4,3,1]}) df['added_gr'] = df.groupby('prod')['quant'].transform('sum') print(df)
执行后得到的结果就是你期望的:
prod quant added_gr 0 A 2 9 1 A 3 9 2 A 4 9 3 B 3 4 4 B 1 4
方法二:分组求和后合并
先单独计算分组求和结果,再通过merge将结果合并到原DataFrame:
import pandas as pd df = pd.DataFrame({'prod':['A','A','A','B','B'],'quant':[2,3,4,3,1]}) # 计算分组求和并重置索引为普通列 sum_result = df.groupby('prod')['quant'].sum().reset_index(name='added_gr') # 左合并原DataFrame df = df.merge(sum_result, on='prod', how='left') print(df)
这种方法更直观,适合需要先查看分组结果的场景,最终效果和方法一一致。
内容的提问来源于stack exchange,提问作者Alexis
相关产品推荐
相关产品推荐

