如何在Pandas DataFrame中聚类前10位相同的14位PIN码并去重?
解决方案
步骤拆解
处理百万级数据集优先考虑效率,用字符串切片替代正则会更高效,具体步骤如下:
- 去重完全重复的PIN:先移除
pin列完全重复的记录,避免后续聚类包含冗余数据。 - 生成聚类键:提取
pin的前10位作为聚类标识,无需正则匹配,字符串切片更直接高效。 - 按聚类分组并排序:按聚类键分组后,根据每组的记录数(聚类规模)从大到小排序输出。
完整代码
# 1. 去除完全重复的pin记录 df_unique = df.drop_duplicates(subset='pin', keep='first') # 2. 生成前10位的聚类键 df_unique['cluster_key'] = df_unique['pin'].str[:10] # 3. 按聚类键分组,计算每组大小,然后按大小降序排序 cluster_sizes = df_unique.groupby('cluster_key').size().sort_values(ascending=False) sorted_clusters = cluster_sizes.index.tolist() # 4. 按排序后的聚类键重新排列数据集 result = df_unique.set_index('cluster_key').loc[sorted_clusters].reset_index() # 按需求输出格式展示(替换"其他列"为实际列名) print(result[['cluster_key', 'pin', '其他列']])
代码说明
- 去重操作:
drop_duplicates(subset='pin')确保每个唯一的pin只保留一条记录,避免重复计算。 - 聚类键生成:
str[:10]直接截取字符串前10位,比正则表达式性能更高,适合百万级数据场景。 - 排序逻辑:先通过
groupby('cluster_key').size()统计每个聚类的规模,降序排序后得到聚类键的顺序,再用loc重新排列数据集,确保输出按聚类规模从大到小排列。
对原有尝试的修正
- 你之前用正则提取完整14位pin进行分组,本质还是按整个pin分组,无法实现前10位聚类的需求;
filter(lambda group: re.match > 1)存在语法错误,re.match需要传入匹配规则和字符串,且filter是过滤组,不是用来分组聚类的工具。
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

