首页 文章

分组Numpy数组并返回最小值

提问于
浏览
1

我有一个像这样的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中做到这一点吗?

谢谢

3 回答

  • 2

    创建一个pandas DataFrame,按GROUPID分组并按 min() 聚合:

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

    如其他人所说,你可以在熊猫中做到这一点,但它是一个相对重量级的抽象,它引入了你可能会或可能不会感兴趣的各种其他复杂性 .

    numpy_indexed包专门用于隔离这类操作:

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

    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
    

    您现在可以在GROUPID列上 groupby ,调用 idxmin 以返回感兴趣的列的最小值的索引,并使用它来过滤orig 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)
    

相关问题