我有一个包含不同数据格式的 .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
如果有任何帮助,我将不胜感激。
最佳答案
有几种方法可以做到这一点:
- 跟踪最后一个值并减去
- 将所有值存储在列表中并逐个元素地减去
- 将所有内容存储在一个 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 的列表,但两者的各个元素都可以使用 [] 符号访问。
关于python - 如何使用 .csv 文件中同一列中的值进行操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22699921/