如何统计DataFrame列条目在另一DF列数组中的出现频次
频次统计实现步骤
按以下步骤操作即可匹配你现有的数据结构,快速得到目标统计结果:
1. 提取已整理好的嵌套交易列表
你当前的items是单单元格存储的全量交易集合,直接把这层嵌套列表取出即可:
all_transactions = items.iloc[0, 0] # 取出后结构为 [['a', 'b'], ['a'], ['b', 'c']]
2. 逐交易统计元素出现频次
单条交易内需要对元素去重,避免同一条交易中重复出现同一个元素导致计数虚高:
freq_dict = {} for trans in all_transactions: # 交易内元素去重后计数 for item in set(trans): freq_dict[item] = freq_dict.get(item, 0) + 1
执行完这步得到的freq_dict结果为 {'a': 2, 'b': 2, 'c': 1},和目标计数完全一致。
3. 将频次映射回consequents表
列表无法直接作为字典键,需要把consequents里的列表条目转成元组后匹配对应频次:
consequents['freq'] = consequents['consequents'].apply( lambda row_item: freq_dict.get(tuple(row_item), 0) )
最终得到的结果表完全符合需求:
| consequents | freq |
|---|---|
| ['a'] | 2 |
| ['b'] | 2 |
| ['c'] | 1 |
通用扩展(支持多元素后继组合)
如果后续consequents出现多元素组合(比如['a','b']需要两个元素同时出现在某条交易里才算一次有效计数),直接替换第2步的计数逻辑即可适配:
# 把所有consequents转成集合格式,便于做子集判断 consequent_groups = [set(c) for c in consequents['consequents'].tolist()] freq_dict = {tuple(group): 0 for group in consequent_groups} for trans in all_transactions: trans_set = set(trans) for group in consequent_groups: # 判断当前交易是否包含完整的后继组合 if group.issubset(trans_set): freq_dict[tuple(group)] += 1
内容的提问来源于stack exchange,提问作者Frying Pan
相关产品推荐
相关产品推荐

