如何高效遍历Pandas DataFrame列实现唯一两两列对比
解决方案
核心思路是用itertools.combinations生成无重复的两两列组合,天然规避colA&colB、colB&colA重复统计的问题,100列仅需计算4950组,计算量极低。
前置依赖导入
import pandas as pd import numpy as np from itertools import combinations
示例数据构造
df = pd.DataFrame({ "colA": [1], "colB": [1], "colC": [2], "colD": [1] })
方法1:通用可自定义对比规则(可读性最优)
适合所有自定义对比逻辑的场景,写法简单易维护:
compare_result = [] # 生成所有不重复的两列组合 for col1, col2 in combinations(df.columns, 2): # 此处可替换为任意自定义对比规则 all_equal = (df[col1] == df[col2]).all() compare_result.append({ "列1": col1, "列2": col2, "对比结果": "yes" if all_equal else "no" }) # 转为DataFrame格式方便后续查看/处理 result_df = pd.DataFrame(compare_result)
方法2:向量化运算(超大量列场景效率最优)
如果对比规则是判断两列全量值是否相等,可直接用矩阵运算完全规避循环,列数过千时性能优势明显:
# 生成列相等布尔矩阵 equal_matrix = df.T.pipe(lambda x: x.eq(x.iloc[:, 0], axis=0)).values for idx in range(1, df.shape[1]): equal_matrix[:, idx] = df.T.eq(df.T.iloc[:, idx], axis=0).values # 仅取上三角区域规避重复对比 upper_mask = np.triu(np.ones_like(equal_matrix, dtype=bool), k=1) result = [ (df.columns[i], df.columns[j], "yes" if equal_matrix[i,j] else "no") for i,j in zip(*np.where(upper_mask)) ] result_df = pd.DataFrame(result, columns=["列1", "列2", "对比结果"])
内容的提问来源于stack exchange,提问作者PCK1992
相关产品推荐
相关产品推荐

