以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
相关产品推荐
相关产品推荐

