多列配对比较并统计不匹配总数的Pandas实现问题
解决Pandas多组配对列的不匹配数量统计问题
问题说明
你需要处理包含多组配对列(如A_1与A_2、B_1与B_2)的Pandas数据集,按ID统计每行中各组配对列的不匹配数量,且不想手动逐一比较15组列。示例数据如下:
import pandas as pd df = pd.DataFrame({ 'ID': ['a','b','c'], 'A_1': [3,4,5], 'B_1': [1,5,7], 'A_2': [3,3,5], 'B_2': [3,3,7] })
期望得到的结果:
df1 = pd.DataFrame({ 'ID': ['a','b','c'], 'A_1': [3,4,5], 'B_1': [1,5,7], 'A_2': [3,3,5], 'B_2': [3,3,7], 'Count': [1,2,0] })
原代码问题分析
你之前的代码无法运行的核心问题:
alist=[A_1,A_2,B_1,B_2]中的元素不是列名字符串,应该写成['A_1','A_2','B_1','B_2']- 使用
df.apply逐行循环处理效率极低,尤其面对15组列的数据集,且通过索引df[i]取元素容易因列顺序变动出错
高效解决方案
利用Pandas的向量化操作,自动匹配所有配对列并统计不匹配数,步骤如下:
- 筛选并排序配对列:分别提取所有以
_1和_2结尾的列,排序确保两组列一一对应 - 批量比较不匹配项:对两组列的数据取整后比较,生成布尔值矩阵(
True表示不匹配) - 统计每行不匹配数:对布尔矩阵的每行求和,得到每行的不匹配总数
完整代码
import pandas as pd # 创建示例数据 df = pd.DataFrame({ 'ID': ['a','b','c'], 'A_1': [3,4,5], 'B_1': [1,5,7], 'A_2': [3,3,5], 'B_2': [3,3,7] }) # 筛选并排序配对列 cols_1 = sorted(df.filter(like='_1').columns) cols_2 = sorted(df.filter(like='_2').columns) # 批量比较不匹配项(保留1位小数) mismatch_matrix = df[cols_1].round(1) != df[cols_2].round(1) # 统计每行不匹配数量 df['Count'] = mismatch_matrix.sum(axis=1) print(df)
运行后输出结果:
ID A_1 B_1 A_2 B_2 Count 0 a 3 1 3 3 1 1 b 4 5 3 3 2 2 c 5 7 5 7 0
优势说明
- 无需手动列配对:自动识别所有
_1/_2配对列,适配15组甚至更多列的场景 - 效率极高:向量化操作比逐行循环快数倍,适合处理大规模数据集
- 鲁棒性强:排序列名确保配对关系不会因列顺序变动出错
内容的提问来源于stack exchange,提问作者Derek
相关产品推荐
相关产品推荐

