为df1中的每个项目查找df2中最接近的项目

时间:2018-09-26 10:25:43

标签: python pandas

如果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
...

以下代码可达到目的,但速度太慢。我如何优化它以使其运行更快? len(df) = 25000大约需要45秒。我需要解决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)

(目的是通过为df中的每一项找到q中最接近的行标签,以通用的方式将列名和行名与值匹配)

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 :(得分:1)

您可以使用this

df2 = pd.merge_asof(df.sort_values('col'), 
                    q.sort_values('col'), 
                    on='col', 
                    by='row', 
                    allow_exact_matches=False)