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

