pandas中如何匹配索赔号对应零件号、统计频次并生成指定格式字典
Pandas大表匹配与字典构建实现方案
全程采用pandas向量化操作,避免逐行遍历,适配百万/千万行级别的大表场景,执行效率远高于循环、apply类写法。
前置变量约定
- 原始3列大表名:
df - 70个随机抽取的保修索赔号存储列表:
target_claim_list
步骤1:匹配目标索赔号对应的零件号
利用isin做向量化筛选,结合去重逻辑规避脏数据干扰:
# 筛选目标行,提取索赔号-零件号的映射关系 claim_part_map = df.loc[ df['warranty_claim_number'].isin(target_claim_list), ['warranty_claim_number', 'key_part_number'] ].drop_duplicates(subset=['warranty_claim_number'])
步骤2:统计零件号全局出现次数
用value_counts直接统计全表每个key_part_number的出现频次,是pandas场景下统计频次性能最优的写法:
# 返回Series,索引为key_part_number,值为对应全表出现次数 part_occur_count = df['key_part_number'].value_counts()
步骤3:构建目标字典
按照要求格式(键为零件号出现次数,值为对应保修索赔号)构建字典:
# 给映射表匹配每个零件号对应的出现次数 claim_part_map['occur_cnt'] = claim_part_map['key_part_number'].map(part_occur_count) # 生成最终字典 result_dict = dict(zip(claim_part_map['occur_cnt'], claim_part_map['warranty_claim_number']))
特殊场景兼容
如果70个索赔号中存在多个索赔号对应零件号的全局出现次数完全相同,字典键的唯一性会导致后写入的索赔号覆盖之前的值。如果需要保留同频次下的所有索赔号,可以替换步骤3的代码为如下版本:
from collections import defaultdict result_dict = defaultdict(list) for _, row in claim_part_map.iterrows(): result_dict[row['occur_cnt']].append(row['warranty_claim_number']) # 转成普通字典 result_dict = dict(result_dict)
此时输出的字典值为列表结构,会存储同一出现次数下对应的所有索赔号。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

