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

Python 如何找到csv文件中每个序列的最大出现次数?,python,csv,Python,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 基本上,我想知道某个组合发生了多少次。我希望: CSV文件中每个序列的最大出现次数(例如A、B、C——顺序和位置无关紧要) 在上述文件中,例如,A、B、C序列出现3次。所以我期望的输

我一直在搜索序列模式挖掘的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

基本上,我想知道某个组合发生了多少次。我希望:

  • CSV文件中每个序列的最大出现次数(例如A、B、C——顺序和位置无关紧要) 在上述文件中,例如,A、B、C序列出现3次。所以我期望的输出是A,B,C,3(我希望输出像这样)。它应该检查csv文件中的所有序列。所以它应该先检查A,然后是b,然后是A,b,然后是C,然后是A,b,C等等。它应该检查CSV中的任何内容,而不是给出A-Z字母的组合

    我用组合来发行,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——顺序和位置无关紧要)设置最大出现次数

    如果将
    csv.reader
    itertools.compositions
    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的实际外观。)如果希望
    计数器
    键看起来更干净,您可以将
    冻结集(组)
    替换为
    元组(已排序(组))

    您可以使用
    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
    
    编解码器
    部分就是这样在Python3中工作的。您可以这样使用:

    for data in read_data('test.csv'):
        print(data)
    
    现在,如果要计算发生次数的项目位于第二行,则可以使用:

    items = [data[1] for data in read_data('test.csv')]
    
    然后将其传递给
    计数器
    对象:

    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))
    
    输入文件:

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

    多次剥离是可以避免的,但是你得到了一个大致的想法…

    使用
    集合。计数器
    对象。你的文件实际上是这样的吗,像
    1a,B,C
    带空格?如果是这样,那么它就不是一个CSV文件。@user1825440:那么,你能把它编辑成真实的文件吗?只是为了排除不兼容。我想让它检查csv文件中的所有序列。你的代码只检查一个。但当我实现它时,它只是显示[]@user1825440您的问题不清楚是否检查了所有序列,请编辑您的问题以指定它。@RaydelMiranda编辑了它。我基本上想知道csv中的序列,从最大发生序列到最小发生序列。