如何在Python中计算序列频率?pymining数据集适配问题
解决pymining处理自有CSV数据集的频繁序列挖掘问题
嘿,我看到你用pymining做频繁序列挖掘时,测试代码跑的很顺,但导入自有CSV数据集就出问题了——这大概率是因为你从CSV读来的DataFrame格式,和seqmining.freq_seq_enum()要求的输入不匹配,咱们一步步来搞定:
核心问题拆解
测试代码里你用的是直接的字符串序列集合(比如('caabc', 'abcb', 'cabc', 'abbca')),但pd.read_csv()返回的是DataFrame表格对象,直接丢给freq_seq_enum()肯定会报错。咱们需要把CSV里的数据转换成pymining能识别的序列格式。
分情况处理你的CSV数据
首先得明确你的sequences-code.csv是什么格式,下面两种最常见的情况对应不同的转换方式:
情况1:CSV每行是完整的字符串序列
如果你的CSV里每行就是一个完整的序列(比如第一行是caabc,第二行是abcb这种),那只需要把DataFrame的第一列提取成列表就行:
import numpy as np import pandas as pd from pymining import seqmining def importdata(): # 读取CSV,因为没有表头,header=None是对的 df = pd.read_csv('C:/Users/asus/Desktop/memoire/sequences-code.csv', sep=';', header=None) # 提取第一列的所有行,转成列表(这就是pymining需要的序列集合) seqs = df.iloc[:, 0].tolist() # 调用频繁序列挖掘,最小支持度设为2(和测试代码一致) freq_seqs = seqmining.freq_seq_enum(seqs, 2) return sorted(freq_seqs) # 调用函数看看结果 if __name__ == "__main__": result = importdata() print(result)
情况2:CSV每行是分隔后的序列元素
如果你的CSV里每行是序列的单个元素(比如第一行是c;a;a;b;c,用分号分隔每个元素),那需要把每行的元素拼接成字符串(或者转成字符列表):
import numpy as np import pandas as pd from pymining import seqmining def importdata(): df = pd.read_csv('C:/Users/asus/Desktop/memoire/sequences-code.csv', sep=';', header=None) seqs = [] # 遍历每一行,把元素拼接成序列 for _, row in df.iterrows(): # 先过滤掉空值(避免CSV里的空单元格干扰) valid_elements = [str(item) for item in row if pd.notna(item)] # 转成字符串,或者直接append(valid_elements)用列表格式也可以 seqs.append(''.join(valid_elements)) freq_seqs = seqmining.freq_seq_enum(seqs, 2) return sorted(freq_seqs) # 测试调用 if __name__ == "__main__": result = importdata() print(result)
常见坑点排查
- 路径问题:Windows路径用
/是没问题的,但一定要确认文件路径和文件名完全正确(比如有没有拼写错,是不是真的在桌面的memoire文件夹里)。 - 数据类型问题:pymining要求每个序列是可迭代的哈希对象,比如字符串、字符列表,绝对不能直接把DataFrame的行对象丢进去。
- 空值处理:如果CSV里有缺失的单元格,一定要过滤掉,不然序列里会混入
nan,导致挖掘结果异常。
验证小技巧
在调用freq_seq_enum()之前,先打印seqs变量,看看是不是和测试代码里的('caabc', 'abcb', 'cabc', 'abbca')格式完全一致——只要格式对了,函数就能正常运行。
内容的提问来源于stack exchange,提问作者student
相关产品推荐
相关产品推荐

