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

如何用Python计算同一列中不同类别间的关联矩阵?

用Python计算疾病共现条件概率矩阵

步骤说明

我们可以借助pandas实现需求,核心思路是先整理出每个患者的疾病集合,再逐一计算疾病对的条件概率(即患疾病i的患者中同时患疾病j的比例)。

代码实现

1. 导入依赖并准备示例数据

import pandas as pd

# 构造示例数据
data = {
    'patient': [101, 101, 102, 102, 102, 103, 104, 104],
    'disease': ['A', 'B', 'A', 'C', 'B', 'A', 'B', 'C']
}
df = pd.DataFrame(data)

2. 整理每个患者的疾病集合

把同一患者的所有疾病合并为集合,方便后续统计共现情况:

# 按患者分组,聚合为疾病集合
patient_diseases = df.groupby('patient')['disease'].agg(set).reset_index()

3. 生成疾病列表并初始化矩阵

提取所有唯一疾病作为矩阵的行和列:

# 获取所有唯一疾病并排序
diseases = sorted(df['disease'].unique())
# 初始化条件概率矩阵
prob_matrix = pd.DataFrame(index=diseases, columns=diseases, dtype=float)

4. 计算条件概率并填充矩阵

遍历每一对疾病,计算P(疾病j | 疾病i):

for i in diseases:
    # 筛选出患有疾病i的患者
    patients_with_i = patient_diseases[patient_diseases['disease'].apply(lambda x: i in x)]
    total_i = len(patients_with_i)
    if total_i == 0:
        # 避免除以0,无患者患i时概率设为0
        prob_matrix.loc[i] = 0
        continue
    for j in diseases:
        # 统计患i的患者中同时患j的数量
        count_ij = len(patients_with_i[patients_with_i['disease'].apply(lambda x: j in x)])
        # 计算条件概率
        prob_matrix.loc[i, j] = count_ij / total_i

5. 查看结果

运行后打印矩阵:

print(prob_matrix.round(2))

输出结果:

A     B     C
A  1.00  0.67  0.33
B  0.50  1.00  0.50
C  0.33  0.67  1.00

比如第一行B列的0.67表示:3名患A的患者中,有2名同时患B,符合示例数据的实际情况。

补充说明

  • 若数据量较大,可改用numpy向量化操作提升效率,上述代码对中小规模数据足够清晰易用。
  • 矩阵对角线值均为1,因为患者必然同时患有自身对应的疾病。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 18:06:05