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

时间:2014-07-30 20:02:15

标签: python csv

我一直在寻找顺序模式挖掘的python实现,我找不到任何东西。

我有一个包含以下数据的csv文件(注意:第一列是重量,第二列是A,B,C) - 图片如下:

enter image description here

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. CSV文件中每个序列的最大出现次数(例如A,B,C - 顺序和地点无关紧要)。
  2. 在上述文件中,例如A,B,C序列发生3次。所以我的EXPECTED输出是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 :(得分: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实际上看起来是什么样的。)如果你希望frozenset(group)键看起来更清洁,你可以用tuple(sorted(group))替换Counter

答案 1 :(得分: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())

这将打印您可以处理的(item, count)对的列表:

for item, count in c.most_common():
    print('sequence "{0}" occurred {1} times'.format(item, count))

答案 2 :(得分: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

myinput文件:

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)]

可以避免多次剥离,但是你会得到一个大概的想法......