分组Numpy数组并返回最小值

2024-10-01 00:20:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样的理由:

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行。在group和return minimum之后,我希望只返回3行。每个GROUPID值一个。在

如果numpy数组不是正确的工具,你能在Pandas中这样做吗?在

谢谢你


Tags: 方法datanp数组arrayyesintdistance
3条回答

正如其他人所说明的,您可以在pandas中实现这一点,但它是一个相对较重的抽象,它引入了您可能感兴趣或可能不感兴趣的各种其他复杂性。在

numpy_indexed包独立地专门处理这类操作:

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

创建pandas数据帧,按GROUPID分组,按min()聚合:

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

在加州大学你可以做到:

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返回感兴趣列的最小值的索引,并使用它来过滤原始数据:

^{pr2}$

您可以看到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)

相关问题 更多 >