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

以Date与Instrument合并DataFrame时行堆叠未合并,求助

解决DataFrame外键合并时未匹配特定行的问题

排查方向及解决步骤

  • 检查键值的隐性差异
    即使数据类型匹配,字符串可能存在空格(首尾或中间)、不可见字符(比如制表符、换行符)。可以用以下代码验证:

    # 检查df1中目标行的Instrument值长度和原始内容
    print(len(df1.loc[df1['Date'] == '2008-01-31', 'Instrument'].iloc[0]))
    print(repr(df1.loc[df1['Date'] == '2008-01-31', 'Instrument'].iloc[0]))
    
    # 同样检查df2的对应值
    print(len(df2.loc[df2['Date'] == '2008-01-31', 'Instrument'].iloc[0]))
    print(repr(df2.loc[df2['Date'] == '2008-01-31', 'Instrument'].iloc[0]))
    

    如果发现有空格或不可见字符,用str.strip()去除首尾空格,或用str.replace()清理特定字符:

    df1['Instrument'] = df1['Instrument'].str.strip()
    df2['Instrument'] = df2['Instrument'].str.strip()
    
  • 检查Date列的精度问题
    即使显示为2008-01-31,Date列可能包含时间戳(比如2008-01-31 00:00:00和2008-01-31 12:00:00),或者是datetime64类型但时区不一致。可以统一转换为纯日期格式:

    df1['Date'] = pd.to_datetime(df1['Date']).dt.date
    df2['Date'] = pd.to_datetime(df2['Date']).dt.date
    

    如果有时区信息,先统一时区后再去除时区:

    df1['Date'] = df1['Date'].dt.tz_localize('UTC').dt.tz_convert(None)
    df2['Date'] = df2['Date'].dt.tz_localize('UTC').dt.tz_convert(None)
    
  • 重复键值检查
    确认两个DataFrame中是否存在多条匹配Date='2008-01-31'且Instrument='AEA000201011'的记录。可以用以下代码统计:

    print(df1[(df1['Date'] == '2008-01-31') & (df1['Instrument'] == 'AEA000201011')].shape[0])
    print(df2[(df2['Date'] == '2008-01-31') & (df2['Instrument'] == 'AEA000201011')].shape[0])
    

    如果某一方有重复行,合并时会产生笛卡尔积导致堆叠,这种情况需要先去重:

    df1 = df1.drop_duplicates(subset=['Date', 'Instrument'])
    df2 = df2.drop_duplicates(subset=['Date', 'Instrument'])
    
  • 合并后验证
    处理完上述问题后,重新执行合并代码,然后检查目标行:

    merge_df = pd.merge(df1, df2, how='outer', on=['Date', 'Instrument'])
    print(merge_df[(merge_df['Date'] == '2008-01-31') & (merge_df['Instrument'] == 'AEA000201011')])
    

内容的提问来源于stack exchange,提问作者Kilian Smith

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 06:00:47