【问题标题】:How to find the maximum number of occurrences for each sequence in a csv file?如何找到 csv 文件中每个序列的最大出现次数?
【发布时间】:2014-07-30 20:02:14
【问题描述】:

我一直在寻找顺序模式挖掘的 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. 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——顺序和位置无关紧要)最大出现次数?

【问题讨论】:

  • 使用collections.Counter 对象。
  • 您的文件实际上是这样的吗,例如带有空格的1 A,B,C?如果是这样,那么它不是 CSV 文件。
  • @user1825440:你能把它编辑成看起来像你的真实文件吗?只是为了排除不兼容。

标签: python csv


【解决方案1】:

如果您将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))

【讨论】:

  • 我希望它检查 csv 文件中的所有序列。您的代码只检查一个。但是当我实现它时,它只是显示 []
  • @user1825440 您的问题不清楚是否要检查所有序列,请编辑您的问题以指定。
  • @RaydelMiranda 编辑了它。我基本上想知道从最大出现序列到最小的csv中的序列。
【解决方案2】:

可以使用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))

【讨论】:

    【解决方案3】:
    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)]
    

    可以避免第一次多次剥离,但您大致了解...

    【讨论】:

      猜你喜欢
      • 2020-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-11
      • 2018-05-08
      • 2011-06-14
      相关资源
      最近更新 更多