如何用Pandas实现逐行值匹配计数并生成对应统计矩阵
Pandas 行两两匹配计数矩阵实现方案
核心思路
不用嵌套循环逐行比对,利用numpy广播机制一次性完成全量运算,效率更高,尤其适合行数多的场景:
- 先将
name列设为索引,后续直接复用为矩阵的行列标签 - 把数值列转成三维数组完成两两比较,同时过滤掉NA值的匹配结果
- 按行对维度求和得到匹配数,最后转成DataFrame格式输出
完整代码
import pandas as pd import numpy as np # 数据构造(如果已经生成df可跳过这段) data = {'name':['A001', 'A002', 'A003', 'A004','A005','A006','A007','A008'], 'Q1':[2,1,1,1,2,1,1,5], 'Q2':[4,4,4,2,4,2,5,4], 'Q3':[2,2,3,2,2,3,2,2], 'Q4':[5,3,5,2,3,2,4,5], 'Q5':[2,2,3,2,2,2,2,2]} df = pd.DataFrame(data) df.at[7, 'Q3'] = None # 核心计算逻辑 # 1. 设置name为索引,仅保留Q开头的数值列 df = df.set_index('name') val_arr = df.values # 2. 广播完成所有行两两比较,同时排除NA值的匹配 equal_mask = val_arr[:, None] == val_arr na_mask = np.isnan(val_arr[:, None]) | np.isnan(val_arr) valid_equal = equal_mask & ~na_mask # 3. 求和得到匹配数,转成DataFrame矩阵 match_matrix = pd.DataFrame(valid_equal.sum(axis=-1), index=df.index, columns=df.index) print(match_matrix)
结果验证
输出的矩阵对角线为行和自身的匹配数:除A008为4(自身存在1个NA值不计入),其余行都是5,符合预期。任意两个不同行的交叉位置就是二者非NA值的匹配总计数。
内容的提问来源于stack exchange,提问作者Peaches
相关产品推荐
相关产品推荐

