如何遍历Pandas列中的嵌套列表并基于其值生成统计字典?
问题描述
我有如下DataFrame:
id some_binary_col some_amount_col nested_lists 123 0 100 ['email_rule','phone_rule','score_rule'] 456 1 500 ['address_rule','zip_rule'] 121 1 300 ['zip_rule','phone_rule'] 122 0 100 ['score_rule','phone_rule','new_rule'] 133 1 200 ['email_rule','address_rule','zip_rule']
可复现代码:
import pandas as pd ids = [123,456,121,122,133] some_binary_col = [0,1,1,0,1] some_amount_col = [100,500,300,100,200] nested_lists = [ ['email_rule','phone_rule','score_rule'], ['address_rule','zip_rule'], ['zip_rule','phone_rule'], ['score_rule','phone_rule','new_rule'], ['email_rule','address_rule','zip_rule'] ] df = pd.DataFrame() df['id'] = ids df['some_binary_col'] = some_binary_col df['some_amount_col'] = some_amount_col df['nested_lists'] = nested_lists
我想要生成一个字典,统计每个规则对应的some_binary_col值为1的次数,示例结果如下:
rule_binary_col_dict = { 'email_rule': 1, 'phone_rule': 1, 'score_rule': 0, 'address_rule': 2, 'zip_rule': 3, 'new_rule': 0 }
注:nested_lists列可能包含大量唯一列表和元素,我不太擅长处理嵌套列表的遍历,不知道如何在嵌套循环里结合条件完成统计。
解决方案
方法1:用Pandas的explode(最简洁)
利用explode把嵌套列表拆分成每行一个规则,筛选some_binary_col=1的行统计次数,最后补全所有规则的计数:
# 拆分嵌套列表,得到每行一个规则的DataFrame exploded_df = df.explode('nested_lists') # 统计some_binary_col=1时各规则的次数 counts = exploded_df[exploded_df['some_binary_col'] == 1]['nested_lists'].value_counts().to_dict() # 获取所有唯一规则,补全计数为0的规则 all_rules = exploded_df['nested_lists'].unique() rule_binary_col_dict = {rule: counts.get(rule, 0) for rule in all_rules} print(rule_binary_col_dict)
输出结果:
{'email_rule': 1, 'phone_rule': 1, 'score_rule': 0, 'address_rule': 2, 'zip_rule': 3, 'new_rule': 0}
方法2:基础嵌套循环(适合理解底层逻辑)
先初始化所有规则的计数为0,再遍历符合条件的行累加计数:
rule_counts = {} # 先初始化所有规则的计数为0 for rules in df['nested_lists']: for rule in rules: if rule not in rule_counts: rule_counts[rule] = 0 # 遍历每一行,当some_binary_col=1时,给对应规则计数+1 for idx, row in df.iterrows(): if row['some_binary_col'] == 1: for rule in row['nested_lists']: rule_counts[rule] += 1 print(rule_counts)
方法3:高效统计(适合大数据量)
用collections.defaultdict避免重复判断规则是否存在,提升大数据量下的性能:
from collections import defaultdict rule_counts = defaultdict(int) # 先收集所有规则,初始化计数 for rules in df['nested_lists']: for rule in rules: rule_counts[rule] += 0 # 确保所有规则都在字典里 # 遍历符合条件的行,累加计数 for row in df[df['some_binary_col'] == 1].itertuples(): for rule in row.nested_lists: rule_counts[rule] += 1 # 转成普通字典(可选) rule_binary_col_dict = dict(rule_counts) print(rule_binary_col_dict)
内容的提问来源于stack exchange,提问作者max
相关产品推荐
相关产品推荐

