簡體   English   中英

將Numpy數組分組並返回最小值

[英]Grouping Numpy Array and Returning Minimum Values

我有一個這樣的ndarray:

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中這樣做嗎?

謝謝

創建一個熊貓DataFrame,按GROUPID分組並按min()聚合:

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

正如其他人所說明的那樣,您可以在熊貓中進行此操作,但這是一個相對較重的抽象,它引入了您可能感興趣或可能不感興趣的各種其他復雜性。

numpy_indexed包專門從事以下類型的操作:

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

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM