首页 > 解决方案 > Pandas 获取行的最小值并存储相应的索引

问题描述

我有一个存储为熊猫数据框的距离矩阵,df其中包含以公里为单位的 400 对坐标之间的距离,如下所示:

        0          1            2           3          4    ....
0   0.000000    1.740838    2.496827    2.577736    1.698938
1   1.740838    0.000000    1.373490    1.741935    1.261969
2   2.496827    1.373490    0.000000    0.420828    0.812797
3   2.577736    1.741935    0.420828    0.000000    1.131974
4   1.698938    1.261969    0.812797    1.131974    0.000000
.
.
.

我对每个点的下一个最近坐标有多接近感兴趣,我得到了:

df[df > 0].min(axis=1)

0      0.074083
1      0.004708
2      0.119431
3      0.167242
4      0.018095

它给出了到下一个最近点的距离(以 KM 为单位)。我还想存储下一个最近点的索引,这样我就有:

     nearest_dist  nearest_id
0      0.074083       3
1      0.004708       151
2      0.119431       7
3      0.167242       4
4      0.018095       81

标签: pythonpandas

解决方案


stack然后groupby+idxmin对系列进行切片。

s = df.rename_axis(columns='nearest_id').stack().loc[lambda x: x > 0]
s = (s.loc[s.groupby(level=0).idxmin()]
      .to_frame('nearest_dist')
      .reset_index(-1))

  nearest_id  nearest_dist
0          4      1.698938
1          4      1.261969
2          3      0.420828
3          2      0.420828
4          2      0.812797

也可以从 numpy 构建 DataFrame。

arr = df.where(df > 0).to_numpy()

pd.DataFrame({'nearest_id': np.nanargmin(arr, 1), 
              'nearest_dist': np.nanmin(arr, 1)},
             index=df.index)

推荐阅读