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

Pandas Merge语句无法获取DataFrame差异,请求排查问题

解决Pandas Merge找差异的问题

首先,先帮你排查merge语句可能踩的坑,再给你直接能拿到差异日期的方法:

你的Merge可能存在的问题

我猜你大概率遇到了以下几个常见问题之一:

  • 未指定匹配列:如果两个DataFrame的日期列名不一样(比如一个叫file_date,一个叫sql_date),没在merge里用on/left_on/right_on指定的话,Pandas会把所有列名相同的列拿来匹配,结果肯定不对。
  • 用了默认的Inner Join:Pandas merge默认是how='inner',只会保留两个DataFrame都有的行,这完全和你找差异的需求相反——你需要的是找出某一边独有的行。
  • 数据类型不匹配:比如你的日期列一个是整数类型(20171211),另一个是字符串类型('20171211'),这种情况下Pandas会认为两者不相等,导致本该匹配的行被当成差异,或者反过来。

正确获取差异日期的方法

先确认两个DataFrame里日期列的名称(假设都叫date,如果不是你替换成实际列名),然后按下面步骤来:

第一步:统一数据类型(关键!)

先检查并统一日期列的类型,避免类型不匹配导致的错误:

# 打印当前类型
print("Directory日期列类型:", df_file_dates_from_directory['date'].dtype)
print("SQL日期列类型:", df_file_dates_from_sql['date'].dtype)

# 统一转成字符串(或者整数,只要两边一致就行)
df_file_dates_from_directory['date'] = df_file_dates_from_directory['date'].astype(str)
df_file_dates_from_sql['date'] = df_file_dates_from_sql['date'].astype(str)

方法一:用Merge+Indicator列找差异

用left join结合_merge列,找出目录里有但SQL里没有的日期:

# 执行left join,添加_merge列标记行的来源
merged_df = df_file_dates_from_directory.merge(
    df_file_dates_from_sql,
    on='date',
    how='left',
    indicator=True
)

# 筛选出只有左边(目录)有的行,提取日期
diff_dates = merged_df[merged_df['_merge'] == 'left_only']['date']
print("差异日期:")
print(diff_dates)

方法二:用isin()直接过滤(更简洁)

如果只是要找某一边独有的值,用isin()加取反操作更直接:

# 找出目录中不在SQL里的日期
diff_dates = df_file_dates_from_directory[
    ~df_file_dates_from_directory['date'].isin(df_file_dates_from_sql['date'])
]['date']
print("差异日期:")
print(diff_dates)

按照你给出的目录日期列表,预期的20171211-20171218这些日期应该会被筛选出来,只要SQL里确实没有这些值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:31:28