Выберите строки из DataFrame B на основе значений в строках в DataFrame A - PullRequest
0 голосов
/ 04 июня 2018

У меня есть два кадра данных.Фрейм данных A:

[distance]      [measure]
17442.77000     32.792658
17442.95100     32.792658
17517.49200     37.648482
17518.29600     37.648482
17565.77600     38.287118
17565.88800     38.287118
17596.93700     41.203340
17597.29700     41.203340
17602.16400     41.477979
17602.83900     41.612774
17618.16400     42.479890
17618.71100     42.681591

и фрейм данных B, который:

[mileage]      [Driver]
17442.8         name1
17517.5         name2
17565.8         name3
17597.2         name4
17602.5         name5
17618.4         name6

для каждой строки [mileage] в фрейме данных B, я хотел бынайдите две строки из [distance] в фрейме данных A, в котором A.loc[(A['distance']>= milage_value) & A['distance']<= mileage_value], чтобы я мог получить что-то вроде этого:

17442.77000     32.792658
17442.8         name1
17442.95100     32.792658
17517.49200     37.648482
17517.5         name2
17518.29600     37.648482
.               .
.               .

Таким образом, я мог бы применить следующую функцию в скользящем окне размером 3:

def f(x):
    return df.iloc[0,1]+(df.iloc[2,1]-df.iloc[0,1])*((df.iloc[1,0]-df.iloc[0,0])/(df.iloc[2,0]-df.iloc[0,0]))
a = df.rolling(window=3, min_periods=1).apply(f)[::3].reset_index(drop=True)

До сих пор я объединял два Dfs и значения сортировки для генерации триплетов, как описано выше, но проблема возникает, когда два значения из df B находятся в диапазоне расстояний в A[distance].Любая подсказка / совет очень ценится!

1 Ответ

0 голосов
/ 04 июня 2018

Я думаю, что вы можете использовать следующее с merge_asof, используя параметр direction и drop_duplicates:

df_before = pd.merge_asof(df_a, df_b, 
                 left_on='distance', 
                 right_on='mileage', 
                 direction='backward')\
              .drop_duplicates(['mileage','Driver'], keep='first')[['distance','measure']]

df_after = pd.merge_asof(df_a, df_b, 
                         left_on='distance', 
                         right_on='mileage', direction='forward')\
             .drop_duplicates(['mileage', 'Driver'], keep='last')[['distance','measure']]

df_middle = df_b.rename(columns={'Driver':'measure','mileage':'distance'})

pd.concat([df_before, df_middle, df_after]).sort_values('distance').drop_duplicates()

Вывод:

     distance  measure
0   17442.770  32.7927
0   17442.800    name1
1   17442.951  32.7927
2   17517.492  37.6485
1   17517.500    name2
3   17518.296  37.6485
4   17565.776  38.2871
2   17565.800    name3
5   17565.888  38.2871
6   17596.937  41.2033
3   17597.200    name4
7   17597.297  41.2033
8   17602.164   41.478
4   17602.500    name5
9   17602.839  41.6128
10  17618.164  42.4799
5   17618.400    name6
11  17618.711  42.6816
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...