2014-03-31 17 views
1

因此,我擁有大約總共9列的csv數據。我特別想看看這9列(第一,第二,第四和第八)中的4個 ,並使用第一和第二來確定要返回的列中哪些列。當另一列使用numpy具有相同值時,csv數據列的段的最小值

所以我的數據看起來是這樣的(幾行)

col 1  col 2  col 4 col 8 
0   -4   19  21 
0   5   16  18 
1   5   17  3 
1   7   5  4 
1   9   6  5 
2   0   13  7 
3   12   14  6 
3   -12   7  8 

我想要做的就是在山坳1(0,1,2,3等每一個獨特的價值。 )我想要查看列2,並在該列中查找最小值(我也必須對此列做最大值但類似的想法),並返回列1中每個數字具有最小列數的列。

到現在爲止我的一切是:

data = np.loadtxt(filenm, skiprows = 1, dtype = float, delimiter = ',') 
    unique = np.unique(data[:,0]) 

在這一點上,我幾乎無能爲力。我試圖搜索col 1中的每個唯一值,但我不知道如何根據col2中的每個值進行此操作。我知道的方法來得到這個在熊貓這樣做,但我專門嘗試使用做一些numpy的

+0

「我知道如何在熊貓上完成這個工作,但我特別想用numpy來做點什麼」。說起幾年來每個工作日幾乎都用過'numpy'的人:爲什麼? – DSM

+0

也許是因爲我嘗試了不同的方法,並且這是作業的一部分,我正在爲其他需要完成的人員進行整理。這基本上是一種嘗試學習numpy而不是其他方法的方法,最終目標是學習這些東西,實際的數據本身只是任務的一部分。 – user3482836

回答

1

我不相信這是一個相當於numpy功能pandas.DataFrame.grouby,但你可以嘗試這樣的事情

unq = np.unique(data[:, 0]).tolist() 
mins = [] 

for val in unq: 
    mask = data[:, 0] == val 
    mins.append((val, data[:, 1][mask].min())) 

或者你可以使用itertools.groupby ......它不太可讀,但更有趣。

from itertools import groupby 
from operator import itemgetter 

grp = groupby(enumerate(data[:, 1].tolist()), key=lambda x : data[:, 0][x[0]]) 
mins = [(i, min(group, key=itemgetter(1))[1]) for i, group in grp] 

在這兩種情況下,mins

[(0.0, -4.0), (1.0, 5.0), (2.0, 0.0), (3.0, -12.0)] 

注: 如果使用itertools.groupby你必須你先gouping的列進行排序。

編輯:

獲取包含的最小值在2列各組的整個行類似於

unq = np.unique(data[:, 0]).tolist() 
mins = [] 

for val in unq: 
    mask = data[:, 0] == val 
    i = data[mask][:, 1].argmin() 
    mins.append((val, data[mask][i, 1:])) 

並採用itertools

grp = groupby(enumerate(data[:, 1].tolist()), key=lambda x : data[:, 0][x[0]]) 
mins = [(i, data[min(group, key=itemgetter(1))[0], 1:]) for i, group in grp] 

使用任一種方法mins將be

[(0.0, array([ -4., 19., 21.])), 
(1.0, array([ 5., 17., 3.])), 
(2.0, array([ 0., 13., 7.])), 
(3.0, array([-12., 7., 8.]))] 
+0

所以我嘗試了這一點,但有一個問題是,它只是在第2列的東西上添加第1列的東西,而是第3列和第4列的東西,根據我選擇的第1列的東西。 – user3482836

+0

請參閱我的編輯。 – JaminSore

相關問題