2014-03-27 33 views
1

我已經獲得了一個具有不同數據格式的.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 

而且我想在第2列(只對那些值。減去,我不在乎其他)。我設法逐個訪問和顯示值,但是我的問題是,因爲我是初學者,所以我很難弄清楚索引如何處理值並可以保存它們以便稍後操作。

的代碼我用的是下面的一個

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

有幾種方法可以做到這一點:

  • 的最後一個值的跟蹤和減去
  • 商店列表中的所有值和減去元素的元素
  • 店一切在一個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])] 
減去元素

歐tput的:

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的列表,但是可以使用[]符號訪問這兩個元素的各個元素。

+0

all_data [1:]爲除第一個元素的數據,並all_data [: - 1]除了最後一個元素的數據,所以他們都有相同的長度,但彼此相差一個。 – ramcdougal

+0

好的答案!愛所有不同的選擇。 :)現在,OP可以探索NumPy以獲取更多數字處理選項,或者瞭解如何使您的「zip」示例成爲更好性能的生成器。 –

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 
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]) 
相關問題