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
以下代码将告诉我是否存在部分匹配(通过最后一列中的 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