python - 基于子字符串匹配执行合并?

标签 python string performance pandas merge

虽然这个问题与 Fuzzy Match Merge with Pandas 密切相关,这个问题具体是关于当一个 DataFrame 中的键完全匹配或另一个 中键的子字符串时(或在本例中为子集)合并的问题>数据框。为了说明我的观点,这里有 2 个 DataFrame:

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 那样分隔匹配code> 到 E282,这不应该发生,而像 O008O0080 这样的匹配应该合并。

预期输出应该是

   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 需要 < 1 分钟。

最佳答案

这是一个难题。也许考虑一下 python 方法? any 都会在此处短路,因此您应该节省一些周期。另外,contains 不一定从头开始检查,因此使用 startswith 应该会更有效。

df1[
    any(
         i.startswith(j) for j in df2.codes.tolist()
    ) for i in df1.codes.tolist()
]

关于python - 基于子字符串匹配执行合并?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50538051/

相关文章:

python - 使用 python scapy 发送 DHCP 发现

Python:通过smtp发送可执行二进制文件到gmail

java - 在特定字符串位置添加字符

string - 在 PL/SQL 中将包含数字组的字符串转换为包含单个数字的逗号分隔字符串

r - 为什么 dplyr 这么慢?

algorithm - 相同长度的最长连续子列表的长度,以及子列表元素求和的奇偶性

python - 将 numpy 整数数组转换为 12 位二进制

python - 在 Python 中从字符串中提取列表

MySQL - 存储用户所在的组

python - 如何在 Windows 上安装 zeroRPC (python)