我有一个包含数千行和4-64列的csv文件(我有大约50个CSV文件,列的数量可能因文件而异,但每个文件的列数都是固定的)。 例如
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 原始文件中的第三行= 28,第4行= 1 因此,新文件中的第2行= 28 + 1 = 29
答案 0 :(得分:1)
如果我了解您的问题,那么在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
…我确定这不是您想要的,因为您想做一些不同于我凭空挑选的数学的数学,但是希望这显然是为什么这是结果以及如何使用相同结果的原因您实际问题的结构。
答案 1 :(得分:0)
首先加载数据:
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,))