【发布时间】:2019-08-08 21:12:08
【问题描述】:
我已经看到关于部分字符串匹配合并 here、here 和其他地方的讨论,但没有关于如何在包含超字符串而不是子字符串的表上执行此操作。
给定样本数据
df1 = pd.DataFrame({'uri': ['http://www.foo.com/index',
'https://bar.net/directory',
'www.baz.gov/aboutus']})
df2 = pd.DataFrame({'fqdn': ['www.foo.com',
'www.qux.mil']})
print(df1)
uri
0 http://www.foo.com/index
1 https://bar.net/directory
2 www.baz.gov/aboutus
print(df2)
fqdn
0 www.foo.com
1 www.qux.mil
我的最终目标是从df1 中删除包含df2 中any 子字符串的行。在实际数据中,df1 有几百万行,df2 有几百行,df1 中的任何给定行在df2 中最多有一个子字符串。
鉴于示例数据,我希望最终得到一个类似的数据框
uri
0 https://bar.net/directory
1 www.baz.gov/aboutus
按照我的逻辑,中间步骤是生成
uri fqdn
0 http://www.foo.com/index www.foo.com
1 https://bar.net/directory np.NaN
2 www.baz.gov/aboutus np.NaN
但我不知道如何检查df2 在df1.apply() 中的所有值。
编辑:
虽然下面的两个答案都有效,但通过编译正则表达式对象并使用extract,我在特定场景中获得了最快的结果:
import re
fqdn_list= re.compile(f"({'|'.join(df2.fqdn)})")
df1['fqdn'] = df1.uri.str.extract(fqdn_list)
【问题讨论】: