如何从Pandas DataFrame提取Ramirez相关的常见非重复事件序列?
提取高频事件序列并排除重复成对的实现方案
核心思路
- 清洗数据:过滤掉每个到访记录中的无效值(
None),只保留有效事件序列。 - 生成有效事件对:遍历每个清洗后的序列,提取连续的事件对,同时跳过两个事件完全相同的成对(如
C1,C1)。 - 统计与排序:统计每个事件对的出现频率,按频率从高到低排序输出。
完整代码实现
from collections import Counter # 示例到访事件数据(若实际是Pandas DataFrame,可将df对应列转为列表传入) visits = [ ['C2', 'C4', 'C1', None, None], ['C2', 'C1', 'C2', None, None], ['C1', 'C3', 'C1', 'C2', 'C3'], ['C1', 'C2', 'C3', None, None] ] # 1. 清洗数据:移除每个序列中的None cleaned_sequences = [[evt for evt in seq if evt is not None] for seq in visits] # 2. 生成符合要求的连续事件对 valid_pairs = [] for seq in cleaned_sequences: # 遍历序列生成相邻元素对,跳过重复成对 for i in range(len(seq) - 1): current_pair = (seq[i], seq[i+1]) if current_pair[0] != current_pair[1]: valid_pairs.append(current_pair) # 3. 统计频率并按降序排序 pair_frequency = Counter(valid_pairs) # 先按出现次数降序,次数相同时按事件对字典序排序 sorted_results = sorted(pair_frequency.items(), key=lambda x: (-x[1], x[0])) # 输出结果 print("事件链频率排序(从高到低):") for pair, count in sorted_results: print(f"{pair[0]},{pair[1]}: {count} 次")
针对Pandas DataFrame的适配
如果你的事件数据存储在Pandas DataFrame的某一列(比如列名为event_sequence),只需替换数据加载部分:
import pandas as pd # 假设df是你的原始DataFrame df = pd.read_csv("your_data.csv") # 或其他方式加载数据 cleaned_sequences = [[evt for evt in seq if evt is not None] for seq in df['event_sequence'].tolist()]
运行示例输出
事件链频率排序(从高到低): C1,C2: 3 次 C2,C3: 2 次 C2,C1: 2 次 C1,C3: 2 次 C2,C4: 1 次 C4,C1: 1 次 C3,C1: 1 次
内容的提问来源于stack exchange,提问作者slow_learner
相关产品推荐
相关产品推荐

