我已经在这里,这里和其他地方看到过关于部分字符串匹配合并的讨论,但是在包含超字符串而不是子字符串的表上如何进行合并却一无所获。
给定样本数据,例如
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
。在实际数据中,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)
将字符串df2
(|
)与管道()作为分隔符连接起来,分隔or
符是regex中的运算符。这样,我们可以检查中是否df1
包含这些字符串中的任何一个,并使用str.contains
和~
哪个将其删除not
;
m = ~df1['uri'].str.contains('|'.join(df2['fqdn']))
df1[m]
输出量
uri
1 https://bar.net/directory
2 www.baz.gov/aboutus
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句