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

如何对比列值格式不同的两个DataFrame并生成指定对比结果?

解决Pandas DataFrame账号格式差异与账户类型匹配问题

核心思路

先对账号和账户类型做标准化处理(仅用于匹配逻辑),同时完整保留原始字段;再通过全外连接合并两个DataFrame,最后整理出需要的结果列。

具体步骤与代码示例

假设你的df1和df2结构如下(示例测试数据):

import pandas as pd

df1 = pd.DataFrame({
    "AccountNo": ["12.34.56", "78.90.12"],
    "Name": ["张三", "李四"],
    "a/ctype": ["Savings Account", "Current-Account"]
})

df2 = pd.DataFrame({
    "AccountNo": ["12-34-56", "34-56-78"],
    "Name": ["张三", "王五"],
    "a/ctype": ["savings account", "current account"]
})
  1. 生成标准化匹配字段
    给两个DataFrame新增专用的标准化列,用来做匹配依据,原字段完全保留:
# 标准化账号:移除所有非数字字符,统一成纯数字格式
df1['std_account'] = df1['AccountNo'].str.replace(r'\D', '', regex=True)
df2['std_account'] = df2['AccountNo'].str.replace(r'\D', '', regex=True)

# 标准化账户类型:移除所有标点符号、转成小写,消除格式差异
df1['std_ctype'] = df1['a/ctype'].str.replace(r'[^\w\s]', '', regex=True).str.lower()
df2['std_ctype'] = df2['a/ctype'].str.replace(r'[^\w\s]', '', regex=True).str.lower()
  1. 全外连接合并,保留所有记录
    用merge的outer模式,基于标准化字段匹配,同时用indicator参数标记每条记录的匹配状态:
df_merge = pd.merge(
    df1, df2,
    on=['std_account', 'std_ctype'],
    how='outer',
    suffixes=('_df1', '_df2'),
    indicator=True
)
  1. 整理生成目标df3
    提取需要的原始字段,把匹配状态转成易懂的中文描述:
df3 = df_merge[[
    'AccountNo_df1', 'AccountNo_df2',
    'Name_df1', 'Name_df2',
    'a/ctype_df1', 'a/ctype_df2',
    '_merge'
]].rename(columns={
    'AccountNo_df1': '原账号_df1',
    'AccountNo_df2': '原账号_df2',
    'Name_df1': '姓名_df1',
    'Name_df2': '姓名_df2',
    'a/ctype_df1': '账户类型_df1',
    'a/ctype_df2': '账户类型_df2',
    '_merge': '匹配结果'
})

# 转换匹配结果为直观描述
df3['匹配结果'] = df3['匹配结果'].map({
    'both': '双方匹配',
    'left_only': '仅df1存在',
    'right_only': '仅df2存在'
})

最终df3会完整保留双方原始格式的账号、姓名、账户类型,同时清晰标记每条记录的匹配状态,且不会丢失任何一方的独有记录。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 08:54:23