如何构建统计同组内value共现频率的交叉表?
共现矩阵(Co-occurrence Matrix)实现方案
你要构建的统计交叉表叫做共现矩阵,它用于记录不同元素在同一组内共同出现的频次。下面直接给出基于Python pandas的实现方案,搭配示例数据说明:
示例数据
假设你的group数据集如下:
| group | value |
|---|---|
| G1 | A |
| G1 | B |
| G1 | C |
| G2 | A |
| G2 | B |
| G3 | B |
| G3 | C |
| G4 | A |
| G4 | C |
期望输出的共现矩阵:
| A | B | C | |
|---|---|---|---|
| A | 0 | 2 | 2 |
| B | 2 | 0 | 2 |
| C | 2 | 2 | 0 |
基础实现代码
import pandas as pd # 1. 加载数据集(替换为你的实际数据) data = pd.DataFrame({ 'group': ['G1', 'G1', 'G1', 'G2', 'G2', 'G3', 'G3', 'G4', 'G4'], 'value': ['A', 'B', 'C', 'A', 'B', 'B', 'C', 'A', 'C'] }) # 2. 按group聚合,收集每个组内的value列表 group_vals = data.groupby('group')['value'].apply(list).reset_index() # 3. 初始化全0的共现矩阵 unique_vals = data['value'].unique() co_occur_mat = pd.DataFrame(0, index=unique_vals, columns=unique_vals) # 4. 遍历每个组,统计value对的共现次数 for _, row in group_vals.iterrows(): vals = row['value'] # 遍历组内所有非重复的value对 for i in range(len(vals)): for j in range(i+1, len(vals)): val_a, val_b = vals[i], vals[j] co_occur_mat.loc[val_a, val_b] += 1 co_occur_mat.loc[val_b, val_a] += 1 # 5. 将对角线(自身共现)设为0 for val in unique_vals: co_occur_mat.loc[val, val] = 0 print(co_occur_mat)
大数据集优化方案
如果你的数据集规模较大,上面的双重循环效率偏低,可以用矩阵乘法实现高效计算:
import pandas as pd import numpy as np # 1. 生成value的one-hot编码矩阵 one_hot = pd.get_dummies(data['value']) # 2. 按group聚合,得到每个组内value的出现标记(1表示出现) group_one_hot = one_hot.groupby(data['group']).sum() # 3. 矩阵乘法直接计算共现次数(含自身) co_occur_mat = group_one_hot.T.dot(group_one_hot) # 4. 清空对角线值 np.fill_diagonal(co_occur_mat.values, 0) print(co_occur_mat)
内容的提问来源于stack exchange,提问作者Shingston
相关产品推荐
相关产品推荐

