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
逻辑说明
- 合并DataFrame:通过
outer join保留所有id,避免遗漏仅在某一个DataFrame中存在的记录。 - 空值填充:将缺失的values填充为空字符串,确保后续分割对比逻辑正常运行。
- 差异提取:
- 把
values按|分割为元素列表,去除多余空格和空元素。 - 对仅在原始DataFrame存在的id(如示例中的
c),直接返回原始值。 - 逐位置对比原始和修改后的元素,收集所有不相等的项并拼接成指定格式。
- 把
优势
相比字典遍历的方式,利用pandas的内置方法更适合处理结构化数据,代码可读性更强,且在处理大规模数据时效率更高。
内容的提问来源于stack exchange,提问作者rshar
相关产品推荐
相关产品推荐

