我是Python的初学者,我不知道如何执行以下操作:
我有一个这种形式的数字数据文本文件:
1461.5 5 9 -18 32 1462 21 5 -6 32 1462 5 4 -23 32 1462.5 17 6 -7 30 1464 11 6 -14 31 1464 8 2 -22 32 1464.5 9 5 -17 31 1465 6 16 -7 29 1467 9 6 -17 32 1467.5 14 9 -8 31 1469.5 13 5 -12 30 1469.5 14 10 -7 31 1471 15 7 -9 31 1471 12 8 -10 30 1471.5 13 11 -7 31 1472 27 4 -1 32 1472 7 13 -8 28 1472 8 8 -14 30
我想了解如何识别第一列中具有相同值的行,在其他列中添加相应的项,并删除第一列中的重复条目,以便生成的输出如下所示:
1461.5 5 9 -18 32 1462 26 9 -29 64 1462.5 17 6 -7 30 1464 19 8 -36 63 1464.5 9 5 -17 31 1465 6 16 -7 29 1467 9 6 -17 32 1467.5 14 9 -8 31 1469.5 27 15 -19 61 1471 27 15 -19 61 1471.5 13 11 -7 31 1472 42 25 -23 90
如果它会使事情变得不那么复杂,那么第一列中的所有数字都可以提前四舍五入为整数(它对后续计算几乎没有影响)。
注意:实际的文本文件包含23,000行。第一列中的值按升序排列。
谢谢, 亚当
答案 0 :(得分:3)
from collections import defaultdict
D = defaultdict(list)
with open("data.txt") as f:
for row in f:
row = row.split()
D[float(row[0])].append([int(x) for x in row[1:]])
for k,v in sorted(D.items()):
print k, [sum(x) for x in zip(*v)]
编辑:由于输入文件始终有序,您可以做得更好
from itertools import groupby
with open("data.txt") as f:
for k,v in groupby(f, key=lambda x:x.split()[0]):
print k, map(sum, zip(*[map(int, x.split()[1:]) for x in v]))
答案 1 :(得分:1)
这有效:
with open('data.txt') as data:
d={}
for row in data:
l=row.split()
key=l[0]
l=[int(e) for e in l[1:]]
if key in d:
d[key]=[x+y for x,y in zip(l,d[key])]
else:
d[key]=l
for e in sorted(d.keys()):
t=tuple([e]+list(map(str,d[e])))
print("{:<7} {:<3} {:<3} {:<3} {:<3}".format(*t))
打印:
1461.5 5 9 -18 32
1462 26 9 -29 64
1462.5 17 6 -7 30
1464 19 8 -36 63
1464.5 9 5 -17 31
1465 6 16 -7 29
1467 9 6 -17 32
1467.5 14 9 -8 31
1469.5 27 15 -19 61
1471 27 15 -19 61
1471.5 13 11 -7 31
1472 42 25 -23 90
答案 2 :(得分:0)
我强烈推荐pandas这类工作。
加载数据:
import io
import pandas as pd
data = """
1461.5 5 9 -18 32
1462 21 5 -6 32
1462 5 4 -23 32
1462.5 17 6 -7 30
1464 11 6 -14 31
1464 8 2 -22 32
1464.5 9 5 -17 31
1465 6 16 -7 29
1467 9 6 -17 32
1467.5 14 9 -8 31
1469.5 13 5 -12 30
1469.5 14 10 -7 31
1471 15 7 -9 31
1471 12 8 -10 30
1471.5 13 11 -7 31
1472 27 4 -1 32
1472 7 13 -8 28
1472 8 8 -14 30
"""
df = pd.read_csv(io.StringIO(data), sep=' *', engine='python', names=['a', 'b', 'c', 'd', 'e'])
df
数据框现在包含您的示例数据:
df
Out[90]:
a b c d e
0 1461.5 5 9 -18 32
1 1462.0 21 5 -6 32
2 1462.0 5 4 -23 32
3 1462.5 17 6 -7 30
4 1464.0 11 6 -14 31
5 1464.0 8 2 -22 32
6 1464.5 9 5 -17 31
7 1465.0 6 16 -7 29
8 1467.0 9 6 -17 32
9 1467.5 14 9 -8 31
10 1469.5 13 5 -12 30
11 1469.5 14 10 -7 31
12 1471.0 15 7 -9 31
13 1471.0 12 8 -10 30
14 1471.5 13 11 -7 31
15 1472.0 27 4 -1 32
16 1472.0 7 13 -8 28
17 1472.0 8 8 -14 30
按第一列对此数据框进行分组,并将所有其他列相加,只需一行:
df2 = df.groupby('a').agg(sum).reset_index()
df2
Out[92]:
a b c d e
0 1461.5 5 9 -18 32
1 1462.0 26 9 -29 64
2 1462.5 17 6 -7 30
3 1464.0 19 8 -36 63
4 1464.5 9 5 -17 31
5 1465.0 6 16 -7 29
6 1467.0 9 6 -17 32
7 1467.5 14 9 -8 31
8 1469.5 27 15 -19 61
9 1471.0 27 15 -19 61
10 1471.5 13 11 -7 31
11 1472.0 42 25 -23 90