Нахождение индекса ближайшего значения из другого кадра данных - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть два кадра данных, измеряющих два свойства инструмента, где глубины смещены для определенного значения dz.Обратите внимание, что приведенный ниже пример чрезвычайно упрощен.

df1 = pd.DataFrame({'depth_1': [0.936250, 0.959990, 0.978864, 0.991288, 1.023876, 1.045801, 1.062768, 1.077090, 1.101248, 1.129754, 1.147458, 1.160193, 1.191206, 1.218595, 1.256964] })

df2 = pd.DataFrame({'depth_2': [0.620250, 0.643990, 0.662864, 0.675288, 0.707876, 0.729801, 0.746768, 0.761090, 0.785248, 0.813754, 0.831458, 0.844193, 0.875206, 0.902595, 0.940964 ] })

Как получить индекс df2.depth_2, который ближе всего подходит к первому элементу df1.depth_1?

Ответы [ 3 ]

0 голосов
/ 26 сентября 2018

Получите абсолютную разницу между всеми элементами df2 и первым элементом df1, а затем получите его индекс:

import pandas as pd
import numpy as np

def get_closest(df1, df2, idx):
   abs_diff = np.array([abs(df1['depth_1'][idx]-item) for item in df2['depth_2']])
   return abs_diff.argmin()

df1 = pd.DataFrame({'depth_1': [0.936250, 0.959990, 0.978864, 0.991288, 1.023876, 1.045801, 1.062768, 1.077090, 1.101248, 1.129754, 1.147458, 1.160193, 1.191206, 1.218595, 1.256964] })

df2 = pd.DataFrame({'depth_2': [0.620250, 0.643990, 0.662864, 0.675288, 0.707876, 0.729801, 0.746768, 0.761090, 0.785248, 0.813754, 0.831458, 0.844193, 0.875206, 0.902595, 0.940964 ] })

get_closest(df1,df2,0)

Вывод:

14
0 голосов
/ 26 сентября 2018

Использование reindex с методом nearest

df2.reset_index().set_index('depth_2').reindex(df1.depth_1,method = 'nearest')['index'].unique()
Out[265]: array([14], dtype=int64)
0 голосов
/ 26 сентября 2018

Вы можете использовать функцию pandas merge_asof (вам нужно будет сначала упорядочить данные, если их нет в реальной жизни)

df1 = df1.sort_values(by='depth_1')
df2 = df2.sort_values(by='depth_2')
pd.merge_asof(df1, df2.reset_index(), left_on="depth_1", right_on="depth_2", direction="nearest")

, если вы просто хотели это для первого значения в df1, выможет сделать соединение в верхнем ряду:

df2 = df2.sort_values(by='depth_2')
pd.merge_asof(df1.head(1), df2.reset_index(), left_on="depth_1", right_on="depth_2", direction="nearest")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...