Pandas DataFrame按多字段分组求和遇NaN问题求助
解决Pandas分组求和后赋值全为NaN的问题
嗨,我来帮你搞定这个问题~你遇到的annual_div列全是NaN的情况,主要是两个小细节出错导致的:
1. GroupBy的参数写法有误
你用groupby('exchange' and 'ticker' and 'year')的写法完全不对哦!在Python里,字符串之间用and做逻辑运算,最终只会返回最后一个非空字符串(因为非空字符串会被视为True),所以你实际上只按year这一列分组了,而且分组后的求和结果索引和原DataFrame不匹配,直接赋值自然就全是NaN了。
正确的分组方式应该是传入列名的列表,明确告诉Pandas要同时按这三列进行分组:
groupby(['exchange', 'ticker', 'year'])
2. 需要用transform实现结果广播到每行
你直接用.sum()['div_amt']得到的是分组后的汇总结果(一个长度远小于原DataFrame的Series),没法直接赋值给原DataFrame的新列。而transform('sum')会帮你把每个分组的求和结果,自动复制到该分组对应的每一行,正好满足你“把求和值放到每个符合条件的行”的需求。
修正后的完整代码
# 转换为日期时间格式 ZACKS_DH_df['year'] = pd.to_datetime(ZACKS_DH_df['div_ex_date']).dt.year # 计算年度股息总和并复制到对应行 ZACKS_DH_df['annual_div'] = ZACKS_DH_df.groupby(['exchange', 'ticker', 'year'])['div_amt'].transform('sum')
这样运行后,annual_div列就会正确显示每个exchange+ticker+year组合对应的div_amt总和,并且每个符合条件的行都会填充这个值啦~
内容的提问来源于stack exchange,提问作者user3709511
相关产品推荐
相关产品推荐

