Python 中部分匹配 XLOOKUP 的等价物

Equivalent of Partial Matching XLOOKUP in Python

以下代码将告诉我是否存在部分匹配(通过最后一列中的 True 值):

import pandas as pd

x = {'Non-Suffix' : ['1234567', '1234568', '1234569', '1234554'], 'Suffix' : ['1234567:C', '1234568:VXCF', '1234569-01', '1234554-01:XC']}
x = pd.DataFrame(x)
x['"Non-Suffix" Partial Match in "Suffix"?'] = x.apply(lambda row: row['Non-Suffix'] in row['Suffix'], axis=1)
x

但是,如果我重新排列第二列中的值,我将得到错误值:

x = {'Non-Suffix' : ['1234567', '1234568', '1234569', '1234554'], 'Suffix' : ['1234568:VXCF', '1234567:C', '1234554-01:XC', '1234569-01']}
x = pd.DataFrame(x)
x['"Non-Suffix" Partial Match in "Suffix"?'] = x.apply(lambda row: row['Non-Suffix'] in row['Suffix'], axis=1)
x

有没有办法让第二个代码块找到这些部分匹配项,即使它们不在同一行中?

此外,有没有办法让我的值 'Partial Match Exists!' 而不是 True,以及 'Partial Match Does Not Exist!' 而不是 False?

您可以将 Non-Suffix 列值与 | 连接起来,然后使用 Series.str.contains 检查是否包含任何值

x['"Non-Suffix" Partial Match in "Suffix"?'] = x['Suffix'].str.contains('|'.join(x['Non-Suffix']))
print(x)

  Non-Suffix         Suffix  "Non-Suffix" Partial Match in "Suffix"?
0    1234567   1234568:VXCF                                     True
1    1234568      1234567:C                                     True
2    1234569  1234554-01:XC                                     True
3    1234554     1234569-01                                     True

上面的解决方案检查 Suffix 是否包含任何 Non-Suffix,如果你想做相反的事情,你可以做

x['"Non-Suffix" Partial Match in "Suffix"?'] = x['Non-Suffix'].apply(lambda v: x['Suffix'].str.contains(v).any())
print(x)

  Non-Suffix         Suffix  "Non-Suffix" Partial Match in "Suffix"?
0        879   1234568:VXCF                                    False
1    1234568      1234567:C                                     True
2    1234569  1234554-01:XC                                     True
3    1234554     1234569-01                                     True