我有一个类似于以下内容的csv文件:
title title2 h1 h2 h3 ...
l1.1 l1 1 1 0
l1.2 l1 0 1 0
l1.3 l1 1 0 1
l2.1 l2 0 0 1
l2.2 l2 1 0 1
l3.1 l3 0 1 1
l3.2 l3 1 1 0
l3.3 l3 1 1 0
l3.4 l3 1 1 0
我希望能够以下列方式添加列:
h1(l1.1 + l1.2 + l1.3)= 2
h1(l2.1 + l2.2)= 1
每列的h1(l3.1 + l3.2 + l3.3 + l3.4)= 3等等
我希望每个这样的值的最终计数作为汇总表:
title2 h1 h2 h3...
l1 2 2 1
l2 1 0 2
l3 3 4 1
我该如何实现?
答案 0 :(得分:2)
这样的事情应该有效。它需要以
形式输入title,title2,h1,h2,h3
l1.1,l1,1,1,0
l1.2,l1,0,1,0
l1.3,l1,1,0,1
l2.1,l2,0,0,1
l2.2,l2,1,0,1
l3.1,l3,0,1,1
l3.2,l3,1,1,0
l3.3,l3,1,1,0
l3.4,l3,1,1,0
和输出
title2,h1,h2,h3
l1,2,2,1
l2,1,0,2
l3,3,4,1
使用Python 3.1.2测试。在Python 2.x中,您需要更改open()
调用以使用二进制模式,并删除newline=""
位。您也可以将调用放到list()
,因为在Python 2.x中,map()
已经返回一个列表。
import csv
import operator
reader = csv.reader(open("test.csv", newline=""), dialect="excel")
result = {}
for pos, entry in enumerate(reader):
if pos == 0:
headers = entry
else:
if entry[1] in result:
result[entry[1]] = list(map(operator.add, result[entry[1]], [int(i) for i in entry[2:]]))
else:
result[entry[1]] = [int(i) for i in entry[2:]]
writer = csv.writer(open("output.txt", "w", newline=""), dialect="excel")
writer.writerow(headers[1:])
keys = sorted(result.keys())
for key in keys:
output = [key]
output.extend(result[key])
writer.writerow(output)
答案 1 :(得分:0)
看看csv模块。你想要做的是用csv.reader打开文件。然后迭代文件,当时一行。您将添加的结果累积到临时列表中。完成后,将此列表写入新的csv.writer。
您可能需要定义一个方言,因为您实际上并没有使用CSV,而是使用制表符分隔的格式。