DataFrame中统计list_of_ids内与当前行同code_name的id出现次数
问题描述
我有一个包含id、code、code_name字段的DataFrame,其中list_of_ids是由id组成的列表。需要统计每行list_of_ids中的id里,与当前行id拥有相同code_name的id的数量。
输入数据
id code code_name list_of_ids 1 AB111 apple [5,2,3,4] 2 AB222 pear [3,4] 3 AB333 banana [1] 4 AB111 apple [] 5 AB222 pear [2,6,4] 6 AB333 banana [1,3,5] 7 AB333 banana [1,3,6]
期望输出
(for_explanation列仅用于展示说明,实际业务中可省略)
id code code_name for_explanation count 1 AB111 apple [pear,pear,banana,apple] 1 2 AB222 pear [banana,apple] 0 3 AB333 banana [apple] 0 4 AB111 apple [] 0 5 AB222 pear [pear,banana,apple] 0 6 AB333 banana [apple,banana,pear] 0 7 AB333 banana [apple,banana,banana] 2
解决方案
实现思路
- 先建立
id与code_name的映射字典,实现O(1)时间复杂度的查询; - 逐行遍历DataFrame,对每行的
list_of_ids统计其中code_name与当前行匹配的id数量。
代码实现
import pandas as pd # 构造输入DataFrame data = { 'id': [1,2,3,4,5,6,7], 'code': ['AB111','AB222','AB333','AB111','AB222','AB333','AB333'], 'code_name': ['apple','pear','banana','apple','pear','banana','banana'], 'list_of_ids': [[5,2,3,4],[3,4],[1],[],[2,6,4],[1,3,5],[1,3,6]] } df = pd.DataFrame(data) # 建立id到code_name的映射字典 id_code_map = df.set_index('id')['code_name'].to_dict() # 定义统计匹配数量的函数 def count_matching_code(row): target_name = row['code_name'] return sum(1 for idx in row['list_of_ids'] if id_code_map.get(idx) == target_name) # 生成count列 df['count'] = df.apply(count_matching_code, axis=1) # 可选:生成用于解释的for_explanation列 def get_explain_list(row): return [id_code_map.get(idx) for idx in row['list_of_ids']] df['for_explanation'] = df.apply(get_explain_list, axis=1) # 输出结果 print(df[['id','code','code_name','for_explanation','count']])
说明
- 映射字典
id_code_map避免了重复查询DataFrame,提升了处理效率; - 若不需要
for_explanation列,直接删除对应代码块即可。
内容的提问来源于stack exchange,提问作者Nadiia
相关产品推荐
相关产品推荐

