将两个series/df的每个元素与pandas中的一个自定义函数进行比较,而不使用for循环



我构建了一个自定义函数,通过比较两个url来获得最长的公共子序列(lcs(。

def lcs_dynamic(url1, url2): 
maths: compare url1 with url2
return lcs

我有一个系列s1和一个系列s2,其中有一堆url(13.000个(。我想将两个系列的每个元素相互比较(169.000000个比较(

我使用了两个嵌套的for循环,但速度太慢了。

for index1, value1 in s1.items():
for index2, value2 in s2.items():
url1 = value1
url2 = value2
if (index1 != index2):
lcs1 = lcs_dynamic(url1, url2) //usage of my custom function
overlap = lcs1 /len(url2)
print({index1}, {index2}, {url1}, {url2}, {overlap})

有更好的方法吗?

我考虑过apply((方法,但我不知道如何访问series2和第二个url,因为我的自定义函数lcs_dynamic需要两个url作为参数

series1.apply(lcs_dynamic(url1, url2))->在这种情况下,我会从series1中获得url1,但如何访问series2和url2…不知道。

提前感谢!

总结以上评论:

首先,定义包含该系列的两个数据帧:

df1 = pd.DataFrame({'url1' : ['url1/path1/subpath1/subpath2', 'url2/path2/subpath1/subpath2']})
df2 = pd.DataFrame({'url2' : ['url1/path1/subpath1', 'url2/path2/subpath1']})

接下来,进行交叉连接以生成所有可能的组合:

df = df1.merge(df2, how='cross')

接下来,应用自定义功能:

df['lcs'] = df.apply(lambda row : lcs_dynamic(row['url1'], row['url2']), axis = 1)
df['overlap'] = df['lcs'] / df['url2'].str.len()

到目前为止运行良好。但是我该如何去除重复项呢。当我进行交叉连接时,我会得到例如

(1;1), (1;2), (1;3)
(2;1), (2;2), (2;3)

我想去掉重复的(1;1(、(2;2(等。但是还有重复的(2(和(2;1(,因为它们对我来说是一样的。

最新更新