计算.csv中特定列中的出现次数,不包含额外字符

时间:2016-12-17 19:54:31

标签: python csv

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

我是否需要使用其他方法对列进行计数以获得所需的结果?有没有更好的方法来选择策略列进行计数?

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
相关问题