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

在Pandas中计算无重叠的对称共现矩阵(含‘all’维度)

无重叠特征共现矩阵的高效Pandas实现

原始数据定义

首先创建目标DataFrame:

import pandas as pd
df = pd.DataFrame({'TFD' : ['AA', 'SL', 'BB', 'D0', 'Dk', 'FF'],
                   'Snack' : [1, 0, 1, 1, 0, 0],
                   'Trans' : [1, 1, 1, 0, 0, 1],
                   'Dop' : [1, 0, 1, 0, 1, 1]}).set_index('TFD')

需求说明

需要生成无重叠的特征共现矩阵,规则如下:

  • 对角线值:仅包含对应单个特征的TFD数量(例如[Snack,Snack]应为1)
  • 交叉项值:仅同时包含对应两个特征的TFD数量(例如[Dop,Trans]应为1,需排除同时含有第三个特征的情况)
  • 矩阵需对称,新增all维度,用于统计同时包含全部三个特征的TFD数量

已实现基于循环的解法,现寻求无循环的高效优化方案。

高效无循环实现方案

步骤1:生成特征组合标识并统计频次

为每个TFD生成唯一的特征组合标识,再统计各组合的出现次数:

# 为每行生成排序后的特征组合字符串,作为分组key
df['feature_group'] = df.apply(
    lambda row: ','.join(sorted(df.columns[row == 1])),
    axis=1
)
# 统计每个特征组合对应的TFD数量
group_counts = df['feature_group'].value_counts()

步骤2:初始化共现矩阵

定义矩阵的行/列索引(原特征列 + all),并初始化全零矩阵:

from itertools import combinations

# 定义矩阵维度
matrix_dims = list(df.columns) + ['all']
# 初始化对称矩阵
cooccur_matrix = pd.DataFrame(0, index=matrix_dims, columns=matrix_dims)

步骤3:填充矩阵值

根据特征组合的统计结果,分别填充单个特征、两两特征、全特征的对应位置:

# 填充对角线:单个特征的情况
for feat in df.columns:
    cooccur_matrix.loc[feat, feat] = group_counts.get(feat, 0)

# 填充交叉项:仅两个特征的情况
for feat1, feat2 in combinations(df.columns, 2):
    # 生成对应特征组合的key
    group_key = ','.join(sorted([feat1, feat2]))
    count = group_counts.get(group_key, 0)
    cooccur_matrix.loc[feat1, feat2] = count
    cooccur_matrix.loc[feat2, feat1] = count

# 填充all维度:同时包含全部三个特征的情况
all_group_key = ','.join(sorted(df.columns))
cooccur_matrix.loc['all', 'all'] = group_counts.get(all_group_key, 0)

最终结果

运行上述代码后,得到的共现矩阵如下:

Snack  Trans  Dop  all
Snack       1      0    0    0
Trans       0      1    1    0
Dop         0      1    1    0
all         0      0    0    2

该方案避免了对TFD的循环遍历,仅针对特征组合进行少量循环(特征数量远小于TFD数量时效率提升显著),同时利用Pandas的分组统计和矩阵索引赋值实现高效计算。

内容的提问来源于stack exchange,提问作者quant

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 13:05:19