遍历DataFrame统计变量值两两组合频次并更新矩阵
解决方法:基于分组有序对统计更新矩阵
我来帮你实现这个需求,核心思路是先按ID分组,生成每组内所有不同值的有序对,统计这些有序对的出现次数,最后把统计结果映射到初始矩阵上,同时保留对角线的初始值。
步骤1:准备示例数据和初始矩阵
首先我们构造示例DataFrame和初始矩阵,你可以直接替换成自己的真实数据:
import pandas as pd import numpy as np from itertools import permutations # 示例DataFrame df = pd.DataFrame({ 'ID': [1,1,1,1,3,3,3,3], 'Value': ['a','b','c','d','a','b','e','f'] }) # 获取所有唯一的Value,确保顺序和初始矩阵一致 unique_values = sorted(df['Value'].unique()) num_vals = len(unique_values) # 初始化矩阵:对角线设为'x',其余为0(如果你的x是数值,直接替换成对应值即可) result_matrix = pd.DataFrame(np.zeros((num_vals, num_vals), dtype=int), index=unique_values, columns=unique_values) # 设置对角线值 for val in unique_values: result_matrix.loc[val, val] = 'x'
步骤2:统计每个ID下的有序对次数
我们遍历每个ID对应的Value集合,生成所有i≠j的有序对,然后统计每个有序对总共出现的次数:
pair_counter = {} # 按ID分组处理 for _, group_data in df.groupby('ID'): current_vals = group_data['Value'].tolist() # 生成所有长度为2的有序排列(自动排除i=j的情况) all_pairs = permutations(current_vals, 2) # 更新计数器 for i, j in all_pairs: pair_counter[(i, j)] = pair_counter.get((i, j), 0) + 1
步骤3:更新矩阵
最后把统计到的次数加到初始矩阵对应的位置上,注意保留对角线的x不被修改:
# 遍历统计结果更新矩阵 for (row, col), count in pair_counter.items(): # 跳过对角线(虽然permutations不会生成i=j的对,但这里做个保险) if row != col: result_matrix.loc[row, col] += count # 查看最终矩阵 print(result_matrix)
结果说明
运行上面的代码后,你会得到符合需求的矩阵:
- 比如
result_matrix.loc['a','b']的值是2,因为ID1和ID3里都有a→b的组合; result_matrix.loc['c','d']的值是1,只有ID1里有这个组合;- 对角线的
x会保持初始值不变。
这种方法逻辑清晰,容易理解,而且能很好地适配任意规模的DataFrame和Value集合。
内容的提问来源于stack exchange,提问作者tdm1996
相关产品推荐
相关产品推荐

