基于ID与日期双键合并Pandas DataFrame出现匹配异常求助
问题诊断与解决:Pandas按ID+日期合并返回空DataFrame
这种情况90%以上是合并键的数据类型不匹配导致的——看起来值完全一样,但底层数据类型不同,Pandas就认不出它们是匹配项。咱们一步步排查解决:
1. 先排查核心列的数据类型
首先运行下面的代码,确认两个DataFrame中ID和date列的类型:
# 查看df_pw6的列类型 print("df_pw6 列类型:") print(df_pw6.dtypes) print("\ndf_ex 列类型:") print(df_ex.dtypes)
你大概率会看到以下两种不一致的情况:
- 日期列:一个是
object(字符串)类型,另一个是datetime64[ns]类型 - ID列:一个是
int(整数)类型,另一个是object(字符串)类型
另外提一句,你手动验证时写的df_ex.iloc[2,0]== df_pw6.iloc[1,1]是笔误(前者是2018-01-08,后者是2018-01-05,不可能相等),正确的匹配应该是df_ex.iloc[2,0] == df_pw6.iloc[2,1]和df_ex.iloc[2,1] == df_pw6.iloc[2,0]——但即使值看起来一致,类型不匹配的话,Pandas的merge还是会判定为不相等。
2. 针对性解决方法
情况A:日期列类型不一致
把两个DataFrame的date列统一转换为datetime类型:
df_pw6['date'] = pd.to_datetime(df_pw6['date']) df_ex['date'] = pd.to_datetime(df_ex['date'])
情况B:ID列类型不一致
把两个DataFrame的ID列统一为相同类型(比如都转成整数):
df_pw6['ID'] = df_pw6['ID'].astype(int) df_ex['ID'] = df_ex['ID'].astype(int)
如果ID里存在非数字内容,也可以统一转成字符串:
df_pw6['ID'] = df_pw6['ID'].astype(str) df_ex['ID'] = df_ex['ID'].astype(str)
3. 重新执行合并
类型统一后,再运行你的合并代码:
# 内连接(只保留匹配项) df19 = pd.merge(df_pw6, df_ex, on=['date', 'ID']) # 左连接(保留df_pw6所有行) df19_left = pd.merge(df_pw6, df_ex, how='left', on=['date', 'ID'])
这时候应该就能得到预期的匹配结果了。
内容的提问来源于stack exchange,提问作者user88484
相关产品推荐
相关产品推荐

