StartDate EndDate Days Strategy 1/4/11 1/20/11 11 Multi #1 1/21/11 1/27/11 4 Multi #18 1/28/11 1/31/11 1 Multi #8 1/31/11 2/3/11 3 Multi #20 2/7/11 2/9/11 2 Multi #10 2/9/11 2/23/11 9 Multi #5 2/23/11 3/4/11 7 Multi #16 3/11/11 3/14/11 1 Multi #20 3/15/11 3/22/11 5 Multi #20
import csv
from collections import Counter
with open('/input.csv') as f:
next(f) # skip header
occurrence = Counter(tuple(row[3:4]) for row in csv.reader(f))
print(occurrence)
with open('/output.csv', 'w') as f:
writer = csv.writer(f)
writer.writerow(['Strategy', 'Counts'])
for (src), cnt in occurrence.items():
writer.writerow([src, cnt])
在上面是一个较大的逗号分隔CSV和我的代码到目前为止在Python 3中的示例。我想读取文件并计算每个策略发生的次数。上面的代码输出我想要的,但有额外的字符。我希望这些行看起来像:
>Multi #1,1
>Multi #18,1
>Multi #8,1
>Multi #20,3
相反,行看起来像:
> "(' Multi #18',)",3
我是否需要使用其他方法对列进行计数以获得所需的结果?有没有更好的方法来选择策略列进行计数?
答案 0 :(得分:0)
只需取每行中的最后两个条目,用空格分隔它们:
with open('/input.csv') as fobj:
next(fobj)
occurrence = Counter(' '.join(line.rsplit(None, 2)[-2:]) for line in fobj)
保留其余代码会提供此输出文件:
Strategy,Counts
Multi #1,1
Multi #18,1
Multi #20,3
Multi #5,1
Multi #10,1
Multi #8,1
Multi #16,1
csv.reader
无法真正读取此输入数据。它只能将一行中的条目拆分为逗号,分号或空格。由于列之间的分隔符是空格,并且最后一列的内容包含空格,因此使用split()
或者在本例中使用rsplit()
字符串的方法来获取内容似乎更简单最后一栏。
答案 1 :(得分:0)
你不必要地切片。注意row[3:4]
(给出一个包含一个字符串的列表)和row[3]
(只是字符串)之间的区别:
>>> row = ['1/4/11', '1/20/11', '11', 'Multi #1']
>>> row[3:4]
['Multi #1']
>>> tuple(row[3:4])
('Multi #1',)
>>> row[3]
'Multi #1'
您想要替换它:
Counter(tuple(row[3:4]) for row in csv.reader(f))
有了这个:
Counter(row[3] for row in csv.reader(f))
解决问题的另一种(不太优选的)方法是在for
循环解包中的括号中添加逗号,以便src
成为单项元组中的项目,并且不是整个元组:
for (src,), cnt in occurrence.items():
writer.writerow([src, cnt])
我猜你以前在为多个专栏做过切片。
如果您只使用索引(row[3]
)而不是切片(row[3:4]
),则可以删除for
循环中的括号:
for src, cnt in occurrence.items():
writer.writerow([src, cnt])
答案 2 :(得分:0)
我假设您的输入文件名为input_file
。
您可以使用itertools.groupby
解决您的问题,如下例所示:
data = tuple(k.strip("\n").split("#") for k in open("input_file", 'r'))
from itertools import groupby
a, b = dict(), list()
for k, v in groupby(data[1:], lambda x : x[1]):
b = list(v)
if k in a.keys():
c = a[k]
a[k] = c + len(b)
else:
a[k] = len(b)
for i in a.keys():
print("Multi #{0},{1}".format(i, a[i]))
输出:
Multi #1,1
Multi #5,1
Multi #10,1
Multi #16,1
Multi #20,3
Multi #18,1
Multi #8,1