如何对比两个DataFrame的行值?修复np.where触发的KeyError报错
Pandas 对比两序列触发KeyError问题修复
报错原因
触发KeyError: 'Target'以及后续逻辑错误的原因共两点:
- 变量引用错误:执行
tar = target['Target']后,tar已经是单独的一维Series,本身存储的就是Target列的所有值,不存在tar['Target']的写法——相当于在一维序列里找不存在的列,直接触发键错误。 - 数据结构不匹配:就算修复上述写法,直接对比也无法得到正确结果:
prof是双层索引(日期+品类)的分组聚合结果,每行对应单日期下单品类的销售额tar是默认整数索引的目标值序列,每行对应单条目标记录
二者索引、聚合粒度完全不对齐,pandas无法直接按行匹配做大小比较。
索引对齐是pandas做序列运算的核心前提,粒度、索引不匹配的运算只会得到空值或错误结果。
正确实现方案
首先需要对齐两个对比序列的粒度和索引,再做判断:
如果你的目标是按日期维度对比当日总销售额是否达标,先把销售额聚合到日粒度再对比,代码如下:
# 按日期汇总总销售额,重置索引保证和target表行顺序、长度对齐 daily_total_amount = prof.groupby(level="date_column").sum().reset_index(drop=True) # 直接用原target表的Target列做判断,不需要单独提取tar变量 target["Target_hit"] = np.where(target["Target"] <= daily_total_amount, 1, 0)
如果你的目标是按行顺序逐行对比两个序列的值(需提前确认两个表行顺序严格一一对应),先把prof的双层索引重置为默认整数索引再对比,代码如下:
# 重置prof索引,和target的默认整数索引对齐 prof_flat = prof.reset_index(drop=True) target["Target_hit"] = np.where(target["Target"] <= prof_flat, 1, 0)
内容的提问来源于stack exchange,提问作者Samar Pratap Singh
相关产品推荐
相关产品推荐

