如何使用.csv文件中相同列中的值进行操作

时间:2014-03-27 21:49:05

标签: python loops csv

我有一个包含不同数据格式的.csv文件,我正在尝试使用同一列上的值进行操作。

我的.csv文件是这样的:

"int","float","string", more stuff...

实施例

"7","1.378","rider 7",...
"9","1.979","rider 9"
"4","2.520","rider 4"
"2","4.711","rider 2"
More rows

我想在第二列中减去值(只有那些,我不关心其他的)。我设法逐个访问和显示值,但我的问题是,因为我是初学者,我不清楚索引如何处理值并可以保存它们以便以后操作。

我使用的代码是以下代码

with open('file.csv','rb') as input:
csvin = csv.reader(input, delimiter=',')

for row in csvin:
    data = float(row[1])
    print "value -> %f " % data

我会看到

1.378
1.979
2.520
4.711
etc

但我的目标是获得用前一个值减去每个值的结果

1.979 - 1.378
2.520 - 1.979
4.711 - 2.520
x - 4.711
etc

我很感激任何帮助。

3 个答案:

答案 0 :(得分:3)

有几种方法可以做到这一点:

  • 跟踪最后一个值并减去
  • 将所有值存储在列表中并逐个元素地减去
  • 将所有内容存储在numpy数组中并减去移位的向量

哪个最好取决于你还想做什么。

举一个具体的例子,让我们从一些数据开始:

csvin = [[1, 6],
        [2, 14],
        [3, 1.1],
        [4, 3.14]]

如果我们运行您的代码,我们会看到:

value -> 6.000000 
value -> 14.000000 
value -> 1.100000 
value -> 3.140000 

因此我们知道数据正在从第二列获取值。

解决方案1:跟踪最后一个元素

last = None
for row in csvin:
    data = float(row[1])
    if last is not None:
        print "difference -> %f" % (data - last)
    last = data

输出:

difference -> 8.000000
difference -> -12.900000
difference -> 2.040000

解决方案2:使用Python列表并逐个元素地减去

all_data = [float(row[1]) for row in csvin]
print "differences: ", [next - curr for next, curr in zip(all_data[1:], all_data[: -1])]

输出:

differences:  [8.0, -12.9, 2.04]

注意:在这里,我们构建了所有值的列表以及与列表推导的差异列表。

解决方案3:NumPy

import numpy
all_data = numpy.array([float(row[1]) for row in csvin])
print "differences: ", all_data[1:] - all_data[: -1]

输出:

differences:  [  8.   -12.9    2.04]

注意:这比解决方案2略微清晰,因为它使用矢量数学。这里的结果是一个numpy数组,而不是解决方案2的列表,但两者的各个元素可以用[]表示法访问。

答案 1 :(得分:1)

你非常接近。

with open('file.csv', 'rb') as infile:
    csvin = csv.reader(infile, delimiter=',')

prev_val = 0
for row in csvin:
    data = float(row[1]) - prev_val
    print 'value -> %f ' % data
    prev_val = data

答案 2 :(得分:0)

以下脚本适用于我......

prev_val = 0.0
with open('file.csv', 'r') as infile:
    csvin = csv.reader(infile, delimiter=',')
    for row in csvin:
        data = float(row[1]) - prev_val
        print('delta is', data)
        prev_val = float(row[1])