2017-04-06 102 views
1

我有這樣的ndarray:分組numpy的數組,並返回最小值

data = [(1,"YES", 54.234), 
     (1,"YES", 1.0001), 
     (2,"YES", 4.234), 
     (3,"YES", 0.234)] 
dtypes = [("GROUPID", np.int), 
      ("HASNEAR", "|S255"), 
      ("DISTANCE", np.float64)] 
array = np.array(data, dtype=dtypes) 

有沒有一種方法對數據進行分組,每個組在一個新的數組只返回的最小距離?

在我的例子中,我有4行。在組和返回最小後,我預計只有3行返回。每個GROUPID值一個。

如果numpy數組不是正確的工具,你可以在Pandas中做到這一點嗎?

謝謝

回答

2

創建大熊貓據幀,按GROUPID和彙總由min()

df = pd.DataFrame(data, columns=('GROUPID','HASNEAR','DISTANCE')) 
df.groupby('GROUPID').min() 
+0

感謝您對本,它非常好! –

1

IIUC您可以在大熊貓做到這一點:

In [8]: 
import pandas as pd 
# construct a df 
df = pd.DataFrame(array) 
df 

Out[8]: 
    GROUPID HASNEAR DISTANCE 
0  1 b'YES' 54.2340 
1  1 b'YES' 1.0001 
2  2 b'YES' 4.2340 
3  3 b'YES' 0.2340 

現在,您可以groupby上GROUPID列,調用idxmin返回分鐘值的指數的興趣和使用列這個過濾原稿DF:

In [9]: 
df.loc[df.groupby('GROUPID')['DISTANCE'].idxmin()] 

Out[9]: 
    GROUPID HASNEAR DISTANCE 
1  1 b'YES' 1.0001 
2  2 b'YES' 4.2340 
3  3 b'YES' 0.2340 

你可以看到idxmin回報是最小值的指標:

In [10]: 
df.groupby('GROUPID')['DISTANCE'].idxmin() 

Out[10]: 
GROUPID 
1 1 
2 2 
3 3 
Name: DISTANCE, dtype: int64 

你可以通過調用.values回到轉換爲numpy的數組:

In [11]: 
df.loc[df.groupby('GROUPID')['DISTANCE'].idxmin()].values 

Out[11]: 
array([[1, b'YES', 1.0001], 
     [2, b'YES', 4.234], 
     [3, b'YES', 0.234]], dtype=object) 
2

正如其他人說明,你可以在熊貓中做到這一點,但它是一個相對重量級的抽象,它引入了你可能感興趣或可能不感興趣的其他各種複雜性。

numpy_indexed包擅長這些類型的業務隔離:

import numpy_indexed as npi 
npi.group_by(data['GROUPID']).min(data['DISTANCE'])