2014-03-30 39 views
2

所以我們可以說我有一個數據,像這樣一個CSV文件:CSV數據 - 列的段最大值使用numpy的

'time' 'speed' 
0  2.3 
0  3.4 
0  4.1 
0  2.1 
1  1.3 
1  3.5 
1  5.1 
1  1.1 
2  2.3 
2  2.4 
2  4.4 
2  3.9 

我希望能夠回到這個文件,以便爲每個越來越多的下頭'時間',我罰款在列速度中發現的最大數字,並返回該數字旁邊的速度數組中的時間。我使用的實際csv文件是更大,所以我想迭代大量的數據,而不是隻是運行它'時間'是0,1或2.

所以基本上我想這要返回:

array([[0,41], [1,5.1],[2,4.4]]) 

專門使用numpy。

+0

什麼都有__你嘗試到目前爲止? – sshashank124

+0

相關:http://stackoverflow.com/q/8623047/279627 –

回答

1

在NumPy中以完全矢量化的方式完成這件事有點棘手。這裏有一個選項:

a = numpy.genfromtxt("a.csv", names=["time", "speed"], skip_header=1) 
a.sort() 
unique_times = numpy.unique(a["time"]) 
indices = a["time"].searchsorted(unique_times, side="right") - 1 
result = a[indices] 

這會將數據加載到一個帶有兩個字段的一維數組中,並首先進行排序。結果是一個數組,其數據按時間分組,最大速度值始終是每組中的最後一個。然後我們確定出現的唯一時間值,併爲每個時間值找到數組中最右邊的項。

1

大熊貓非常適合用於這種東西:

>>> from io import StringIO 
>>> import pandas as pd 
>>> df = pd.read_table(StringIO("""\ 
... time speed 
... 0  2.3 
... 0  3.4 
... 0  4.1 
... 0  2.1 
... 1  1.3 
... 1  3.5 
... 1  5.1 
... 1  1.1 
... 2  2.3 
... 2  2.4 
... 2  4.4 
... 2  3.9 
... """), delim_whitespace=True) 
>>> df 
    time speed 
0  0 2.3 
1  0 3.4 
2  0 4.1 
3  0 2.1 
4  1 1.3 
5  1 3.5 
6  1 5.1 
7  1 1.1 
8  2 2.3 
9  2 2.4 
10  2 4.4 
11  2 3.9 

[12 rows x 2 columns] 

一旦你的數據幀,所有你需要的是groupby時間和aggregate的最大速度:

>>> df.groupby('time')['speed'].aggregate(max) 
time 
0  4.1 
1  5.1 
2  4.4 
Name: speed, dtype: float64 
+1

即使'numpy'是這個問題的錯誤選擇,而'熊貓'是一個更好的選擇,OP確實說「使用numpy具體」.. – DSM

相關問題