Python实现多列疾病组合的出现频率统计方案咨询
疾病组合频率统计解决方案
核心思路
通过itertools.combinations生成所有2、3、4列的疾病组合,逐行判断组合内疾病是否同时出现,最终统计每个组合的出现次数。以下是基于Pandas的实现脚本,直接输出统计结果。
完整代码示例
import pandas as pd from itertools import combinations from collections import defaultdict def count_disease_combinations(df, min_size=2, max_size=4): # 初始化频率统计字典 combo_freq = defaultdict(int) disease_columns = df.columns.tolist() # 遍历2到4列的组合长度 for combo_length in range(min_size, max_size + 1): # 生成当前长度的所有疾病列组合 for cols in combinations(disease_columns, combo_length): combo_name = '&'.join(cols) # 判断每行是否所有疾病都存在(假设1=患病,0=未患病) is_combo_present = df[list(cols)].all(axis=1) # 统计该组合出现的次数 combo_freq[combo_name] = is_combo_present.sum() # 转换为DataFrame并按频率降序排列 result_df = pd.DataFrame( list(combo_freq.items()), columns=['疾病组合', '出现频率'] ).sort_values('出现频率', ascending=False) return result_df # ---------------------- 测试用例 ---------------------- # 模拟疾病数据(1表示患病,0表示未患病) sample_data = pd.DataFrame({ '糖尿病': [1, 0, 1, 1, 0], '高血压': [1, 1, 0, 1, 0], '冠心病': [0, 1, 1, 1, 0], '高血脂': [1, 0, 0, 1, 1] }) # 执行统计并打印结果 stat_result = count_disease_combinations(sample_data) print(stat_result)
关键细节说明
- 数据适配:如果你的疾病标记不是1/0,而是布尔值、"患病"/"未患病"等,只需修改
is_combo_present的判断逻辑:- 布尔值:
is_combo_present = df[list(cols)].all(axis=1)(直接使用) - 文本标记:
is_combo_present = (df[list(cols)] == "患病").all(axis=1)
- 布尔值:
- 结果格式:最终返回的DataFrame包含两列,分别是疾病组合名称(如"糖尿病&高血压")和对应的出现频率,已按频率降序排列,方便查看高频组合。
内容的提问来源于stack exchange,提问作者marita
相关产品推荐
相关产品推荐

