如何用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
相关产品推荐
相关产品推荐

