我有一个包含“N”行和“3”列的列表。如果连续行的前两个元素相同,那么我想在第三列中添加元素并返回带有添加的“第三列”值的单行。
e.g。
120.638000 -21.541700 0.3
120.638000 -21.541700 0.8
121.331001 -21.795500 0.5
120.688004 -21.587400 0.1
120.688004 -21.587400 0.5
120.688004 -21.587400 0.9
121.525002 -21.504200 0.9
到
120.638000 -21.541700 1.1 (add third column of row 1 and 2)
121.331001 -21.795500 0.5
120.688004 -21.587400 1.5 (sum(0.1,0.5,0.9))
121.525002 -21.504200 0.9
在python中实现这个的任何建议?
答案 0 :(得分:3)
您可以使用csvreader
读取数据,然后您可以使用defaultdict根据第1,2列中相同的元组对第3列求和:
from collections import defaultdict
from csv import csvreader
result = defaultdict(float)
with open("<datafile>") as f:
data = csvreader(f, delimiter='\t')
for a,b,c in data:
result[(a,b)] += float(c)
for (a,b),c in result.items():
print(a, b, c)
这不一定与dicts没有排序的顺序相同。
答案 1 :(得分:0)
使用库from("timer:foo?period=5000")
.to("http4://ebc.cybersource.com/ebc/DownloadReport/xxx.csv?authMethod=Basic&authUsername=scott&authPassword=tiger")
.to("file:target/messages/download");
生成行列表。
使用字典键来维护1-2列的唯一列值。汇总字典值中第三列的总值。
{{1}}
如果您希望结果列在3元素列表中,
{{1}}
我认为依靠浮点数相等是不可靠的。如果精度始终与示例数据中指示的相同 - 我并不关心处理时间以进行调查 - 我可能会使用
{{1}}对我的方法更有信心。
答案 2 :(得分:0)
import operator
import itertools
with open('blah') as infile, open('blahout', 'w') as outfile:
writer = csv.writer(outfile, delimiter='\t')
for k,group in itertools.groupby(csv.reader(infile, delimiter='\t'), operator.itemgetter(0,1)):
writer.writerow(list(k) + [sum(float(r[-1]) for r in group)])