我有一个像这样的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中做到这一点吗?
谢谢
答案 0 :(得分:2)
创建一个pandas DataFrame,按GROUPID分组并按min()
聚合:
df = pd.DataFrame(data, columns=('GROUPID','HASNEAR','DISTANCE'))
df.groupby('GROUPID').min()
答案 1 :(得分:2)
如其他人所说,你可以在熊猫中做到这一点,但它是一个相对重量级的抽象,它引入了你可能会或可能不会感兴趣的各种其他复杂性。
numpy_indexed包专门针对这些类型的操作:
import numpy_indexed as npi
npi.group_by(data['GROUPID']).min(data['DISTANCE'])
答案 2 :(得分: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
您现在可以在GROUPID列上groupby
,调用idxmin
返回感兴趣列的最小值索引,并使用它来过滤原始数据:
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
:
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)