如何找到CSV文件中每个序列的最大出现次数?
我一直在寻找Python实现的序列模式挖掘,但找不到相关的资料。
我有一个CSV文件,里面的数据如下(注意:第一列是权重,第二列是A、B、C)——下面是图片:
1 A,B,C
5 D,E,F,X,Z
6 P,Q,R
1 A,B,C,F
2 D,P,Q
4 E,X,R
1 W,Y
2 A,C,P,D,B
3 R,W,Y
在这里,我基本上想找出某种组合出现的次数。我希望得到以下结果:
- 每个序列的最大出现次数(比如A、B、C——顺序和位置不重要)在CSV文件中。
在上面的文件中,A、B、C这个序列出现了3次。所以我期望的输出是A、B、C、3(我希望输出是这样的)。它应该检查CSV文件中的所有序列。所以它应该先检查A,然后是B,再是A、B,接着是C,然后是A、B、C等等。它不应该给出A-Z字母的组合,而是应该检查CSV中实际存在的内容。
我使用了组合来实际生成1、2、3、4的组合。
alphabet = frozenset(combination(ListofAlphabet, 3)) #three combinations. List is from A-Z
for row in fileread:
if alphabet.issubset(row[1]):
output += 1
print '{},{}'.format(alphabet, output)
但这样并不能给出CSV中出现次数最多的序列,因为我手动输入了组合。那么,我该如何在CSV文件中找到每个序列的最大出现次数(比如A、B、C——顺序和位置不重要)呢?
3 个回答
0
from collections import Counter
def myfunc(yourWord, seq):
c1 = Counter(yourWord)
c2 = Counter(seq)
return not (c2 - c1)
def runMe(filePath):
with open(filePath,"r") as f:
results=[]
data = f.readlines()
for x in data:
count=0
for y in data:
if myfunc("".join(y.strip().split(",")), x.strip().split(",")):
count=count+1
results.append((x.strip(),count))
return results
if __name__ == '__main__':
print runMe("input")
print runMe("myinput")
输入文件:
A,B,C
D,E,F,X,Z
P,Q,R
A,B,C,F
D,P,Q
E,X,R
W,Y
A,C,P,D,B
R,W,Y
我的输入文件:
A,B
A,C,B
A
C,B
结果:
[('A,B,C', 3), ('D,E,F,X,Z', 1), ('P,Q,R', 1), ('A,B,C,F', 1), ('D,P,Q', 1), ('E,X,R', 1), ('W,Y', 2), ('A,C,P,D,B', 1), ('R,W,Y', 1)]
[('A,B', 2), ('A,C,B', 1), ('A', 3), ('C,B', 2)]
这样可以避免多次去掉多余的部分,但你大概能明白意思……
0
你可以使用 csv
模块来解析CSV文件:
import csv
import codecs
def read_data(filename, *options):
with codecs.open(filename, 'rb', encoding='utf-8') as f:
for data in csv.reader(f, *options):
yield data
这里的 codecs
部分是为了让它在Python 3中也能正常工作。你可以这样使用:
for data in read_data('test.csv'):
print(data)
现在,如果你想统计的是第二行的项目,你可以使用:
items = [data[1] for data in read_data('test.csv')]
然后把这个结果传给一个 Counter
对象:
import collections
c = collections.Counter(items)
print(c.most_common())
这样会打印出一个 (项目, 计数)
的列表,你可以像这样处理:
for item, count in c.most_common():
print('sequence "{0}" occurred {1} times'.format(item, count))
0
如果你把 csv.reader
、itertools.combinations
和 collections.Counter
这几个工具结合起来使用,应该就能实现你想要的功能。例如,可以像下面这样写:
import csv
from collections import Counter
from itertools import combinations
counts = Counter()
with open("letters.csv", "rb") as fp:
reader = csv.reader(fp)
for row in reader:
letters = row[1].split(",")
for group in combinations(letters, 3):
counts[frozenset(group)] += 1
print counts.most_common(1)
这样做会得到
dsm@winter:~/coding$ python letters.py
[(frozenset(['A', 'C', 'B']), 3)]
(假设我猜对了你的 CSV 文件的实际内容。)如果你想让 Counter
的键看起来更整洁,可以把 frozenset(group)
替换成 tuple(sorted(group))
。