You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用pandas.merge_asof合并数据结果异常的问题求助

Pandas merge_asof 合并后bonus/penalty全为0的排查思路

核心排查方向

  • 严格确认排序执行逻辑
    merge_asof要求两张表必须按on指定的date列升序排序,且by字段(salon_id、staff_id)的分组内也要保证date有序。检查代码是否在排序后未重新赋值,比如:
    # 错误写法:排序结果未保存
    administrators_system_with_schemes_sort.sort_values(by=['salon_id', 'staff_id', 'date'])
    # 正确写法:覆盖原变量
    administrators_system_with_schemes_sort = administrators_system_with_schemes_sort.sort_values(by=['salon_id', 'staff_id', 'date'])
    bonus_and_penalty_for_staff_id_administrators_sort = bonus_and_penalty_for_staff_id_administrators_sort.sort_values(by=['salon_id', 'staff_id', 'date'])
    
  • 验证date字段类型完全一致
    确保两张表的date字段都是datetime64类型,而非字符串或混合格式。用df.dtypes检查,转换时指定格式避免解析歧义:
    administrators_system_with_schemes_sort['date'] = pd.to_datetime(administrators_system_with_schemes_sort['date'], format='%Y-%m-%d')
    bonus_and_penalty_for_staff_id_administrators_sort['date'] = pd.to_datetime(bonus_and_penalty_for_staff_id_administrators_sort['date'], format='%Y-%m-%d')
    
  • 检查分组匹配的有效性
    确认主表中存在与bonus表那条2024-10-12记录完全相同的salon_id和staff_id的行。如果主表无对应分组,merge_asof会返回NaN,后续可能被代码中的fillna(0)填充为0。用以下代码验证分组重叠:
    # 提取目标bonus记录的分组信息
    target_group = bonus_and_penalty_for_staff_id_administrators_sort[(bonus_and_penalty_for_staff_id_administrators_sort['date'] == '2024-10-12') & (bonus_and_penalty_for_staff_id_administrators_sort['bonus'] == 4070)][['salon_id', 'staff_id']]
    # 检查主表是否有对应分组的记录
    has_match = len(pd.merge(administrators_system_with_schemes_sort, target_group, on=['salon_id', 'staff_id'])) > 0
    print("是否存在匹配分组:", has_match)
    
  • 排查隐式的0填充操作
    检查合并后的代码是否存在fillna(0),或者bonus/penalty字段在原表中默认值就是0。先查看合并后的原始结果(不做填充),确认是NaN还是原生0:
    merged = pd.merge_asof(
        administrators_system_with_schemes_sort,
        bonus_and_penalty_for_staff_id_administrators_sort[['salon_id', 'staff_id', 'date', 'bonus', 'penalty']],
        on='date',
        by=['salon_id', 'staff_id'],
        direction='nearest'
    )
    print(merged[['bonus', 'penalty']].isna().sum())
    
  • 用简化样本测试定位问题
    提取最小测试集:只保留bonus表中那条2024-10-12的记录,以及主表中同分组、日期接近的几条记录,手动执行merge_asof。如果简化场景能成功匹配,说明原数据中存在干扰项(比如重复分组日期、异常值)。

内容的提问来源于stack exchange,提问作者John Doe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 03:15:03