使用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ý
相关产品推荐
相关产品推荐

