Поиск ближайшего элемента в df2 для каждого элемента в df1 - PullRequest
0 голосов
/ 26 сентября 2018

Если df выглядит как

    row col     value
0     7   G        96
1     3   C        43
2     7   H        44
3     7   J        97
4     8   I        90
...

и q равно

    row col    value
0     2   C      foo
1     8   F    bravo
2     9   F  charlie
3     2   D      bar
4     2   E      qux
...

Приведенный ниже код служит цели, но работает слишком медленно.Как я могу оптимизировать это, чтобы работать быстрее?Это займет ~ 45 секунд, когда len(df) = 25000.Мне нужно решить, когда len(df) >= 1e6.

def foo(a):
    try:
        fxlter = q.loc[(q.row == a.row) & (q.col < a.col)]
        return q.loc[fxlter.col.idxmax()].value
    except ValueError:
        return None

df['foo'] = df.nodes.apply(foo)

(Цель состоит в том, чтобы сопоставить имя столбца и имя строки с общим значением путем поиска метки ближайшей строки в q длякаждый элемент в df)

enter image description here

Желаемый результат:

    row col  value      foo
0     7   G     96    alpha
1     3   C     43      foo
2     7   H     44    alpha
3     7   J     97    alpha
4     8   I     90    bravo
5     3   E     58      foo
6     8   H     95    bravo
7     7   I     49    alpha
8     3   D     22      foo
9     8   J     55    bravo

1 Ответ

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

Вы можете использовать merge_asof:

df2 = pd.merge_asof(df.sort_values('col'), 
                    q.sort_values('col'), 
                    on='col', 
                    by='row', 
                    allow_exact_matches=False)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...