基于Pandas计算多组聚类算法输出中姓名对的共同出现频次
实现思路
- 外连接不适合该场景的核心原因是:你需要统计的是组合级别的共现关系,而非列维度的匹配,改用「簇内组合生成+全局计数」的逻辑会更简单稳定,出错概率更低
- 核心步骤:
- 对每个聚类结果的每个簇,生成所有无序、不重复的两两姓名配对(通过提前排序姓名避免
John&Katie和Katie&John被识别为不同配对) - 全局维护配对计数器,每在一个簇中出现一次对应配对,计数器加1
- 最终输出计数器的结果即可匹配你需要的格式
- 对每个聚类结果的每个簇,生成所有无序、不重复的两两姓名配对(通过提前排序姓名避免
代码实现
通用Python版本(无第三方依赖)
from itertools import combinations from collections import defaultdict # 全局配对计数器 pair_counter = defaultdict(int) # 所有聚类结果的列表,每个元素对应一组聚类输出,结构为{簇ID: [该簇所有姓名]} all_cluster_results = [ {0: ["John", "Katie", "Peter"], 1: ["Paul", "Ruth", "Linda"]}, {0: ["John", "Katie", "Ruth"], 1: ["Paul", "Linda"]}, {0: ["John", "Katie"], 1: ["Paul", "Ruth"], 2: ["Peter", "Linda"]} ] for cluster_res in all_cluster_results: # 遍历当前聚类结果的每一个簇 for name_list in cluster_res.values(): # 生成簇内所有不重复无序两两配对 for pair in combinations(sorted(name_list), 2): pair_counter[pair] += 1 # 按共现次数降序输出结果 for (name1, name2), count in sorted(pair_counter.items(), key=lambda x: -x[1]): print(f"{name1} & {name2}: {count}")
Pandas版本(适配表格式输入)
如果你的原始数据是合并后的表格格式(列包含:姓名、簇ID、数据集ID),可以用以下代码:
import pandas as pd from itertools import combinations from collections import defaultdict # 示例输入表结构 df = pd.DataFrame([ ["John", 0, 1], ["Katie", 0, 1], ["Peter", 0, 1], ["Paul", 1, 1], ["Ruth", 1, 1], ["Linda", 1, 1], ["John", 0, 2], ["Katie", 0, 2], ["Ruth", 0, 2], ["Paul", 1, 2], ["Linda", 1, 2], ["John", 0, 3], ["Katie", 0, 3], ["Paul", 1, 3], ["Ruth", 1, 3], ["Peter", 2, 3], ["Linda", 2, 3] ], columns=["name", "cluster_id", "dataset_id"]) pair_counter = defaultdict(int) # 按数据集ID分组处理每组聚类结果 for _, dataset_df in df.groupby("dataset_id"): # 按簇ID分组处理每个簇 for _, cluster_df in dataset_df.groupby("cluster_id"): name_list = sorted(cluster_df["name"].tolist()) for pair in combinations(name_list, 2): pair_counter[pair] += 1 # 转为要求的输出表格 result_df = pd.DataFrame([ {"姓名1": k[0], "姓名2": k[1], "共现次数": v} for k, v in pair_counter.items() ]).sort_values("共现次数", ascending=False).reset_index(drop=True) print(result_df)
内容的提问来源于stack exchange,提问作者ComputerVisionEngineer
相关产品推荐
相关产品推荐

