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

遍历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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:10:00