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

Python 3.7中如何对比两个DataFrame的差异并生成指定结果?

对比两个DataFrame的values列差异并生成指定格式结果

解决方案代码

import pandas as pd

# 构造示例数据(替换为你的实际DataFrame)
df_orig = pd.DataFrame({
    'id': ['a', 'b', 'c'],
    'values': ['123 | 345`$ | 657', '345 | 123 | 345', '564 | 356']
})

df_mod = pd.DataFrame({
    'id': ['a', 'b'],
    'values': ['256 | 345 | 657', '345 | 123/+ | 345']
})

# 外连接两个DataFrame,保留所有id
merged_df = pd.merge(df_orig, df_mod, on='id', how='outer', suffixes=('_orig', '_mod'))
merged_df = merged_df.fillna('')

# 定义差异提取函数
def extract_diff(orig_val, mod_val):
    # 分割字符串为元素列表,去除空值和多余空格
    orig_elements = [elem.strip() for elem in orig_val.split('|') if elem.strip()]
    mod_elements = [elem.strip() for elem in mod_val.split('|') if elem.strip()]
    
    # 处理仅在原始DataFrame存在的id
    if not mod_val:
        return orig_val
    # 处理仅在修改后DataFrame存在的id(示例未包含,保留逻辑)
    if not orig_val:
        return mod_val
    
    # 逐位置对比元素,收集差异项
    diffs = []
    max_length = max(len(orig_elements), len(mod_elements))
    for idx in range(max_length):
        orig_elem = orig_elements[idx] if idx < len(orig_elements) else ''
        mod_elem = mod_elements[idx] if idx < len(mod_elements) else ''
        if orig_elem != mod_elem:
            diffs.extend([orig_elem, mod_elem])
    
    return ' | '.join(diffs)

# 生成差异列并整理结果
merged_df['diff'] = merged_df.apply(lambda row: extract_diff(row['values_orig'], row['values_mod']), axis=1)
result = merged_df[['id', 'diff']]

# 输出结果
print('diff')
print(result.to_string(index=False))

运行结果

diff
id     diff
a      123 | 256 | 345`$ | 345
b      123 | 123/+
c      564 | 356

逻辑说明

  1. 合并DataFrame:通过outer join保留所有id,避免遗漏仅在某一个DataFrame中存在的记录。
  2. 空值填充:将缺失的values填充为空字符串,确保后续分割对比逻辑正常运行。
  3. 差异提取:
    • 把values按|分割为元素列表,去除多余空格和空元素。
    • 对仅在原始DataFrame存在的id(如示例中的c),直接返回原始值。
    • 逐位置对比原始和修改后的元素,收集所有不相等的项并拼接成指定格式。

优势

相比字典遍历的方式,利用pandas的内置方法更适合处理结构化数据,代码可读性更强,且在处理大规模数据时效率更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 18:15:38