【发布时间】:2018-11-05 09:01:08
【问题描述】:
虽然此问题与 Fuzzy Match Merge with Pandas 密切相关,但此问题专门关于合并 only(或在本例中为子集)当一个 DataFrame 中的键是完全匹配时,或另一个DataFrame 中的键的子字符串。为了说明我的观点,这里有 2 个DataFrames:
df1
id code
0 1 E282
1 2 O0080
2 3 R52
3 4 J0100
4 5 F99
df2
code val
0 V282 11
1 O008 12
2 J0101 13
3 F99 14
4 R55 15
使用difflib 的问题在于我真的不想匹配最接近的字符串,而且我不确定我是否能够将V282 之类的匹配项分开到E282,这应该' t 发生并且像 O008 到 O0080 这样的匹配应该合并。
预期的输出应该是
code1 id
0 O0080 2
1 F99 5
我可以得到这个结果
import numpy as np
df1[np.logical_or.reduce([df1['code'].str.contains(code) for code in df2.code.tolist()])]
但由于 df1 的行长为 42M 行,而 df2 包含约 4000 个代码,因此这种方法速度慢得令人难以置信。这是我要做的最好的吗?这似乎很不幸,当内部合并一个 21M 行 df 和一个 7M 行 df 在精确键上需要
【问题讨论】:
-
df1代码是否总是以df2代码开头 - 多余的字符总是在末尾? -
是的,多余的字符总是在末尾。
-
哦,答案有用吗?花了多长时间?我很好奇。
-
@coldspeed 是的,它确实加快了速度。现在只需要 15% 的时间,这是可控的。
标签: python string performance pandas merge