如果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中最接近的行标签,以通用的方式将列名和行名与值匹配)
所需的输出:
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
答案 0 :(得分:1)
您可以使用this:
df2 = pd.merge_asof(df.sort_values('col'),
q.sort_values('col'),
on='col',
by='row',
allow_exact_matches=False)