基于Currency和Date合并DataFrame失败问题求助
解决DataFrame合并匹配失败的思路
嘿,我来帮你一步步排查这个合并匹配失败的问题,咱们从最常见的原因开始梳理:
1. 先确认货币代码完全一致
首先要排查df['currency_str']和xrate['Currency']的取值是不是完全匹配——比如有没有大小写差异(比如cad vs CAD)、多余空格或者特殊字符?你可以跑这段代码看看:
# 打印两个列的唯一值,对比差异 print("df中的货币类型:", df['currency_str'].unique()) print("xrate中的货币类型:", xrate['Currency'].unique())
如果发现有大小写或者格式问题,统一转成大写(或小写)就能解决:
df['currency_str'] = df['currency_str'].str.strip().str.upper() xrate['Currency'] = xrate['Currency'].str.strip().str.upper()
2. 检查日期列的匹配细节
虽然你已经把两个日期列转成了datetime64[ns],但还有几个坑要注意:
- 日期精度问题:
xrate['Date']是纯日期(没有时分秒),而你从created_date_time转换来的列,会不会残留了时分秒?可以用这段代码验证:
如果df的日期有时间部分,直接用# 查看xrate日期的时间部分,纯日期的话会输出[NaT] print("xrate日期的时间部分:", xrate['Date'].dt.time.unique()) # 查看df格式化后日期的时间部分 print("df日期的时间部分:", df['formatted_created_date_time'].dt.time.unique())floor('D')把时间清零:df['formatted_created_date_time'] = df['formatted_created_date_time'].dt.floor('D') xrate['Date'] = xrate['Date'].dt.floor('D') - 日期范围是否重叠:从你给出的xrate样本来看,它的日期是2018年的,你得确认df里的
formatted_created_date_time是不是在xrate的日期范围内:
如果df的日期都是比xrate晚很多的,那肯定匹配不到,得检查数据来源是不是正确。print("xrate的日期范围:", xrate['Date'].min(), "→", xrate['Date'].max()) print("df的日期范围:", df['formatted_created_date_time'].min(), "→", df['formatted_created_date_time'].max())
3. 验证具体的(货币+日期)组合是否存在
可以生成组合键,直接查看df里哪些组合在xrate中找不到:
# 创建货币+日期的组合键 df['combined_key'] = df['currency_str'] + '_' + df['formatted_created_date_time'].astype(str) xrate['combined_key'] = xrate['Currency'] + '_' + xrate['Date'].astype(str) # 找出df中不存在于xrate的组合键 missing_keys = df[~df['combined_key'].isin(xrate['combined_key'])]['combined_key'].unique() print("找不到匹配的组合键数量:", len(missing_keys)) print("部分缺失的组合:", missing_keys[:10])
这能帮你快速定位到底是哪些具体的(货币+日期)对没有匹配到,是数据缺失还是格式问题。
4. 排查时区问题
从你的系统时间截图来看是CST时区,要确认两个日期列的时区是否一致:
print("xrate Date列的时区:", xrate['Date'].dt.tz) print("df格式化日期列的时区:", df['formatted_created_date_time'].dt.tz)
如果一个带时区、一个不带,会导致匹配失败,统一时区就好:
# 把带时区的列转成无时区(以xrate为例) xrate['Date'] = xrate['Date'].dt.tz_localize(None)
5. 小样本手动验证
拿df里的几行数据,手动去xrate里查有没有匹配项,比如:
# 取df前3行的货币和日期 sample = df[['currency_str', 'formatted_created_date_time']].head(3) print("待匹配的样本:") print(sample) # 在xrate中查找对应匹配 matches = xrate[(xrate['Currency'].isin(sample['currency_str'])) & (xrate['Date'].isin(sample['formatted_created_date_time']))] print("xrate中找到的匹配项:") print(matches)
如果这一步都找不到结果,那要么是这些样本的(货币+日期)在xrate里确实不存在,要么还是格式没对齐。
内容的提问来源于stack exchange,提问作者Peter Lucas
相关产品推荐
相关产品推荐

