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

使用Python-Pandas筛选分组实现cluster-1与cluster-2最大计数匹配

Pandas 实现方案

前置说明

假设你输入数据的簇列字段名为cluster,文件名列字段名为file_name,可根据你的实际字段名替换代码中对应内容。

实现步骤

  • 第一步:读取数据并过滤无效条目
    先剔除未明确指定的文件条目,不纳入统计范围:
    import pandas as pd
    
    # 读取输入数据,支持csv、excel等格式,对应调整读取方法即可
    df = pd.read_csv("your_input_file.csv")
    # 过滤掉未指定的文件,可根据你实际的未指定标记调整过滤条件
    df = df[df["file_name"].notna() & (df["file_name"] != "未指定")]
    
  • 第二步:分别统计两个簇的文件出现计数
    # 统计cluster-1各文件的出现次数
    cluster1_count = df[df["cluster"] == "cluster-1"].groupby("file_name").size().reset_index(name="count_c1")
    # 统计cluster-2各文件的出现次数
    cluster2_count = df[df["cluster"] == "cluster-2"].groupby("file_name").size().reset_index(name="count_c2")
    
  • 第三步:对齐两个簇的最大计数值
    取两个簇的最大计数的公共基准,将两个簇的计数缩放至同一最大值:
    max_c1 = cluster1_count["count_c1"].max()
    max_c2 = cluster2_count["count_c2"].max()
    # 以两个最大值的较小值为统一基准,也可根据需求自定义基准值
    unified_max = min(max_c1, max_c2)
    # 缩放两个簇的计数
    cluster1_count["scaled_count"] = cluster1_count["count_c1"] / max_c1 * unified_max
    cluster2_count["scaled_count"] = cluster2_count["count_c2"] / max_c2 * unified_max
    
  • 第四步:计算文件相似度并输出结果
    匹配两个簇的同名文件,计算相似度后按相似度从高到低排序,即可得到列相似度最高的文件:
    # 合并两个簇的计数数据
    merge_df = pd.merge(
        cluster1_count[["file_name", "scaled_count"]],
        cluster2_count[["file_name", "scaled_count"]],
        on="file_name",
        suffixes=("_c1", "_c2")
    )
    # 计算相似度,数值越接近1相似度越高
    merge_df["similarity"] = 1 - abs(merge_df["scaled_count_c1"] - merge_df["scaled_count_c2"]) / unified_max
    # 按相似度降序排序
    result = merge_df.sort_values("similarity", ascending=False).reset_index(drop=True)
    
    # 导出结果
    result.to_excel("output_result.xlsx", index=False)
    

可选调整

如果需要使用其他相似度计算规则,可修改第四步中similarity的计算逻辑,比如用余弦相似度、杰卡德相似度等适配你的业务需求。

内容的提问来源于stack exchange,提问作者Patrik Novotný

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 20:36:01