【问题标题】:loop over CSV rows and subtract current row from previous row using python循环遍历CSV行并使用python从前一行中减去当前行
【发布时间】:2019-12-26 21:23:02
【问题描述】:

我有一个 CSV 文件,看起来像这样:

row1
1
3
5
8

我需要从一行到它的跟随行获得不同:

row1
1  1-1 = 0
3  3-1 = 2
5  5-3 = 2
8  8-5 = 3

然后得到结果的平均值(0, 2, 2, 3)。不是寻找一个直接的答案,而是一个起点

【问题讨论】:

  • "Not looking for a straight answer but a start point" 使用open 读取文件

标签: python loops csv


【解决方案1】:

这是一种方法:

with open("test.csv") as f:
    lines = f.readlines()
# the first row is always 0
result = [0,] + [ int(lines[x]) - int(lines[x-1]) for x in range(1,len(lines))]
#print the array of differences
print(result)
#print the average
print(sum(result)/len(result))

【讨论】:

  • 对于这两个例子,我都收到了这个错误:
  • 对于这两个示例,我都收到此错误:(“ValueError:Invalid literal for int() with base 10: 'jan-2010,867884)。我忘了提到我还有另一个在我正在处理之前的行。不确定这是否是导致问题的原因。
【解决方案2】:

如果你只想要一个起点:

with open("yourfile.csv", "r") as f:
    lines = f.readlines()
for index, line in enumerate(lines[1:]):
    number = int(line)
    if index == 0:
        # magic for the first row
    else:
        # magic for a normal row

您必须以不同的方式处理第一行,因为您不能向后看,因为它是第一行。

编辑:解决方案

with open("input.csv", "r") as f:
    lines = f.readlines()
output = [0]
header = lines[0]
data = [int(number) for number in lines[1:]]
for index, number in enumerate(data[1:],1):
    output.append(number-data[index-1])
print(output)
print("Average: {}".format(sum(output)/len(output)))

输出:

[0, 2, 2, 3]
Average: 1.75

【讨论】:

  • 或者只是从第二行开始魔法,它将保存不必要的if(除了第一行它总是评估相同):enumerate(lines[1:], 1)
  • 另外,将r 提供给open 是多余的,因为它是默认设置,可以只使用with open("yourfile.csv") as f:
  • 我可以得到完整的解决方案吗?我仍然无法将这些放在一起。
  • 真的忘记了标题。
猜你喜欢
  • 2021-01-04
  • 2015-08-10
  • 1970-01-01
  • 2015-03-23
  • 2017-01-21
  • 2020-12-06
  • 1970-01-01
  • 2022-01-26
  • 1970-01-01
相关资源
最近更新 更多