Python 如何找到csv文件中每个序列的最大出现次数?
我一直在搜索序列模式挖掘的python实现,但没有找到任何东西 我有一个包含以下数据的csv文件(注意:第一列是重量,第二列是a、B、C)——图片如下: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次。所以我期望的输
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
基本上,我想知道某个组合发生了多少次。我希望:
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中的序列,从最大发生序列到最小发生序列。