У меня есть матрица расстояний, хранящаяся в виде кадра данных pandas df, который содержит расстояния между 400 парами координат в километрах следующим образом: 0 1 2 3 4 ...
2 ответа
Вы можете использовать concat
и ту же идею, что и для min
, но с idxmin
.
m = df>0
res = pd.concat([df[m].min(axis=1), df[m].idxmin(axis=1)],
axis=1, keys=['nearest_dist','nearest_id'])
print(res)
nearest_dist nearest_id
0 1.698938 4
1 1.261969 4
2 0.420828 3
3 0.420828 2
4 0.812797 2
Или даже проще с agg
res = (df[m].agg(['min', 'idxmin'], axis=1)
.rename(columns={'min':'nearest_dist', 'idxmin':'nearest_id'}))
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
Также можно построить DataFrame из numpy.
arr = df.where(df > 0).to_numpy()
pd.DataFrame({'nearest_id': np.nanargmin(arr, 1),
'nearest_dist': np.nanmin(arr, 1)},
index=df.index)
Похожие вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.