【问题标题】:How to operate with values in the same column in .csv files如何对 .csv 文件中同一列中的值进行操作
【发布时间】:2014-05-07 03:40:05
【问题描述】:

我有一个具有不同数据格式的 .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

如果有任何帮助,我将不胜感激。

【问题讨论】:

    标签: python loops csv


    【解决方案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】:

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

      • 跟踪最后一个值并减去
      • 将所有值存储在一个列表中并逐个元素减去
      • 将所有内容存储在一个 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 的列表,但两者的各个元素都可以使用 [] 表示法访问。

      【讨论】:

      • all_data[1:] 是第一个元素以外的数据,all_data[:-1] 是最后一个元素以外的数据,所以它们的长度相同,但从一个接一个。
      • 不错的答案!喜欢所有不同的选择。 :) 现在 OP 可以探索 NumPy 以获得更多数字处理选项,或者弄清楚如何使您的 zip 示例成为更好性能的生成器。
      【解决方案3】:

      以下脚本适用于我...

      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])
      

      【讨论】:

        猜你喜欢
        • 2020-07-23
        • 1970-01-01
        • 1970-01-01
        • 2021-08-18
        • 2014-07-26
        • 1970-01-01
        • 1970-01-01
        • 2017-10-05
        • 1970-01-01
        相关资源
        最近更新 更多