如何比较不同长度、数据类型的两个DataFrame?
解决方案
核心思路是把两个DataFrame的num列统一转换为纯字符串格式,消除类型和格式差异后再进行比较。
步骤1:统一列格式
- 处理df2的
num列:先将float类型转为整数(你的df2数据都是整数型浮点值),再转成字符串,避免.0后缀干扰匹配 - 处理df1的
num列:直接将Object类型转为字符串,把混合的整数/字符串统一成字符串格式
代码示例:
import pandas as pd # 模拟原始数据 df1 = pd.DataFrame({'num': [100899, 1980903, 'AB347980', 'RT198090']}) df2 = pd.DataFrame({'num': [100899.0, 1980903.0, 937974938.0, 2837982.0]}) # 统一格式为字符串 df1['num_str'] = df1['num'].astype(str) df2['num_str'] = df2['num'].astype(int).astype(str)
步骤2:执行比较操作
根据需求选对应的方式:
找两表共有的num值(交集)
用merge关联筛选匹配行:
common_entries = pd.merge(df1, df2, on='num_str', how='inner') print(common_entries[['num_x', 'num_y']]) # 输出包含100899、1980903这两组匹配数据
找df1独有的num值(差集)
用isin筛选:
df1_only = df1[~df1['num_str'].isin(df2['num_str'])] print(df1_only['num']) # 输出AB347980、RT198090
找df2独有的num值
同理操作:
df2_only = df2[~df2['num_str'].isin(df1['num_str'])] print(df2_only['num']) # 输出937974938.0、2837982.0
特殊情况处理
如果df2的num列存在非整数型浮点值(比如123.45),别直接转整数,改成转字符串后去掉.0后缀:
df2['num_str'] = df2['num'].astype(str).str.replace(r'\.0$', '', regex=True)
内容的提问来源于stack exchange,提问作者User277883
相关产品推荐
相关产品推荐

