(python)如果条件满足tru,则在连续行中添加元素

2024-05-08 01:52:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个“N”行和“3”列的列表。如果连续行的前两个元素相同,那么我想在第三列中添加元素,并返回一行添加了“thirdcolumn”值的行。在

例如

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    

^{pr2}$

对于在python中实现这一点有什么建议吗?在


Tags: 元素列表建议pr2thirdcolumn
3条回答

使用库csv生成行列表。在

使用字典键维护列1-2值的唯一对。聚合字典值中第三列的总值。在

totals = {}
for (a,b,c) in list_of_rows:
    if (a,b) in totals:
        totals[(a,b)] += c
    else:
        totals[(a,b)] = c

如果您希望结果显示在三元素列表的列表中

^{pr2}$

我认为在浮动上指望平等是不可靠的。如果精度始终与示例数据中所示的相同,并且我不太关心处理时间,因此不需要进行调查

for (int(a*1e6), int(b*1e6), c) in list_of_rows:对我的方法更有信心。在

可以使用csvreader读取数据,然后使用defaultdict根据column1,2中相同的元组对column3求和:

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没有排序。在

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)])

相关问题 更多 >