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

如何比较列无序的两个Pandas DataFrame行并找出差异?

解决两个属性无序的Pandas DataFrame对比问题

核心思路

因为属性列是无序的,先对每行的属性值(排除id)进行排序标准化,让属性集合相同的行拥有完全一致的结构,再对比标准化后的DataFrame即可。

具体步骤

1. 检查属性列集合是否一致

首先确认两个DataFrame的属性列(除id外)完全相同,否则直接判定为不相等:

import pandas as pd

# 假设id列名为'id'
attrs_df1 = set(df1.columns.drop('id'))
attrs_df2 = set(df2.columns.drop('id'))

if attrs_df1 != attrs_df2:
    print("两个DataFrame的属性列集合不一致,直接判定为不相等")
else:
    # 继续后续标准化操作
    pass

2. 对DataFrame进行标准化处理

批量对每行的属性值排序,生成标准化后的DataFrame,避免逐行apply的性能损耗:

# 获取属性列列表(顺序不影响,后续会排序)
attrs_cols = list(attrs_df1)

# 处理df1:对每行属性列排序,合并id列
df1_attrs_sorted = df1[attrs_cols].apply(sorted, axis=1, result_type='expand')
df1_standard = pd.concat([df1['id'], df1_attrs_sorted], axis=1)

# 同样处理df2
df2_attrs_sorted = df2[attrs_cols].apply(sorted, axis=1, result_type='expand')
df2_standard = pd.concat([df2['id'], df2_attrs_sorted], axis=1)

3. 判断两个DataFrame是否相等

用Pandas自带的equals方法直接对比标准化后的结果:

is_equal = df1_standard.equals(df2_standard)
print(f"两个DataFrame是否相等:{is_equal}")

4. 找出差异行

如果不相等,通过合并去重的方式提取差异行:

# 给两个标准化后的DataFrame添加来源标记
df1_standard['来源'] = 'df1'
df2_standard['来源'] = 'df2'

# 合并两个DataFrame
combined_df = pd.concat([df1_standard, df2_standard])

# 找出在两个DataFrame中都存在的行(即无差异行)
duplicated_mask = combined_df.duplicated(subset=combined_df.columns.drop('来源'), keep=False)
non_diff_rows = combined_df[duplicated_mask]

# 剩余的就是差异行
diff_rows = combined_df.drop(non_diff_rows.index)

print("差异行详情:")
print(diff_rows)

性能优化提示

如果数据量较大(数千行+数百列),可以用numpy的排序函数进一步提升效率:

import numpy as np

# 用numpy批量排序属性列
df1_attrs_sorted = pd.DataFrame(np.sort(df1[attrs_cols].values, axis=1), index=df1.index)
df1_standard = pd.concat([df1['id'], df1_attrs_sorted], axis=1)

df2_attrs_sorted = pd.DataFrame(np.sort(df2[attrs_cols].values, axis=1), index=df2.index)
df2_standard = pd.concat([df2['id'], df2_attrs_sorted], axis=1)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 14:36:26