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

基于Pandas计算多组聚类算法输出中姓名对的共同出现频次

实现思路
  • 外连接不适合该场景的核心原因是:你需要统计的是组合级别的共现关系,而非列维度的匹配,改用「簇内组合生成+全局计数」的逻辑会更简单稳定,出错概率更低
  • 核心步骤:
    1. 对每个聚类结果的每个簇,生成所有无序、不重复的两两姓名配对(通过提前排序姓名避免John&Katie和Katie&John被识别为不同配对)
    2. 全局维护配对计数器,每在一个簇中出现一次对应配对,计数器加1
    3. 最终输出计数器的结果即可匹配你需要的格式
代码实现

通用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 14:27:02