我有一个有几千行和4-64行的csv文件(我有大约50个CSV文件,每个文件的列数可能不同,但每个文件都有固定的列数)。e.g
0 0 0 0 0 0 0\n
0 0 0 0 0 0 0\n
1 2 3 4 5 6 7\n
0 0 0 0 0 0 1\n
因此,我需要首先对每一行求和,然后使用一些数学公式将连续的两行相加。最好的pythonic方式是什么?我可以在新文件中写入新值。因此,新文件的行数将少于原始文件,因为它合并了两行的值。例如,CSV1在对不同列求和后,行1中的值为0,行2中的值为0。因此,新文件第1行将为0+0 =0,原始文件中的第3行将为28,第4行将为1,因此,新文件中的第2行将为28+1 = 29
发布于 2018-07-28 07:06:04
首先加载数据:
import csv
with open("path/to/file.csv", "r") as f:
reader = csv.reader(f)
rows = [float(row) for row in reader]
现在需要成对处理行,所以在列表上迭代一个普通的for
循环不会有太大帮助。
summed_rows = []
for i in range(0, len(rows), 2):
first_row_sum = sum(rows[i])
second_row_sum = sum(rows[i + 1])
both_rows_sum = first_row_sum + second_row_sum
summed_rows.append((both_rows_sum,)) # Each row must be iterable
(假设行数为偶数。如果行数为奇数,second_row_sum
的计算将在最后失败。)
在for
循环执行之后,您的summed_rows
应该是您需要的输出,您只需要将它写入一个文件。
with open("path/to/output.csv", "w") as output:
writer = csv.writer(output)
for row in summed_rows:
writer.writerow((row,))
发布于 2018-07-28 06:55:51
如果我理解您的问题,那么在stdlib的帮助下,您想要做的事情非常简单。
首先,打开文件:
with open(path) as f:
然后附加一个csv.reader
,这会将它从行的可迭代转换为行列表的可迭代:
rows = csv.reader(f, delimiter=' ')
这些行中的每一行都是作为字符串的列的列表。显然,您需要将它们转换为int
或float
或其他格式,以便对其进行数学运算:
rows = (map(float, row) for row in rows)
现在,您需要将其转换为相邻行对的可迭代。如果您查看Recipes in the itertools
docs,就会发现有一个pairwise
函数可以对任何迭代器执行此操作。但这很简单,只需手动完成:
it1, it2 = itertools.tee(rows)
next(it2)
pairs = zip(it1, it2)
现在,pairs
是成对的行的可迭代。所以我们可以遍历它:
for xrow, yrow in pairs:
我不确定您想要对这些行做什么。也许你想要,我不知道,列的差的平方根?无论你想要什么,都应该很简单:
diffs = (x - y for x, y in zip(xrow, yrow))
sumsquares = sum(diff*diff for diff in diffs)
print(sumsquares**0.5)
这将打印出来:
0.0
11.832159566199232
11.269427669584644
…我确定这不是你想要的,因为你想做一些和我凭空选择的数学不同的数学,但希望这显然是为什么这是结果,以及如何使用相同的结构来解决你的实际问题。
https://stackoverflow.com/questions/51566436
复制相似问题