Pandas分组计算累计加权平均后与原表join失败的解决方案求助
问题原因&解决方案
你现有代码存在3处核心错误,是导致join失败的根本原因:
- 第一处错误:
groupby(level='sid')不存在对应层级,你第一次聚合的分组键是firm和date,聚合结果的索引层级只有这两个字段,没有名为sid的层级,这里应该改为按firm分组做累计求和,才能得到同一家公司按日期递进的累计加权平均结果 - 第二处错误:变量名不一致,你前面把聚合结果存在
g变量中,后续计算时却调用了未定义的g_text_emo['count'],变量名不匹配导致计算逻辑错误 - 第三处错误:索引对齐逻辑存在隐患,聚合后的
g索引默认是[firm, date],如果原df的索引不是这两个字段,直接指定on参数关联容易出现对齐问题,用merge关联普通字段更稳妥
写法1:调整原有join逻辑的正确实现
# 按firm+date聚合单日的compound总和、评论数 g = df.groupby(['firm', 'date'])['compound'].agg(['sum', 'count']) # 按firm分组,对总和、评论数做累计求和 g = g.groupby(level='firm').cumsum() # 计算累计加权平均后直接join,自动对齐firm+date索引 df = df.join(g['sum'].div(g['count']).rename('cum_avg_compound'), on=['firm', 'date'])
写法2:用merge实现,无需处理索引适配问题
# 计算完累计加权平均后重置索引,转为普通字段 g = df.groupby(['firm', 'date'])['compound'].agg(['sum', 'count'])\ .groupby(level='firm').cumsum()\ .assign(cum_avg_compound=lambda x: x['sum']/x['count'])\ .reset_index()[['firm', 'date', 'cum_avg_compound']] # 用merge关联,适配所有索引情况 df = df.merge(g, on=['firm', 'date'], how='left')
如果调整代码后仍然存在关联失败的情况,可按以下步骤排查:
- 检查
date字段格式是否统一,比如是否存在字符串格式和datetime格式混存的情况,统一转为datetime格式更稳妥:df['date'] = pd.to_datetime(df['date']) - 检查
firm字段是否有空格、大小写不一致的脏数据,可先做标准化清洗:df['firm'] = df['firm'].str.strip()
内容的提问来源于stack exchange,提问作者Chocolate_coffee
相关产品推荐
相关产品推荐

