如何找到CSV文件中每个序列的最大出现次数?

0 投票
3 回答
1170 浏览
提问于 2025-04-18 15:24

我一直在寻找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

在这里,我基本上想找出某种组合出现的次数。我希望得到以下结果:

  1. 每个序列的最大出现次数(比如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.readeritertools.combinationscollections.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))

撰写回答