首页 > 解决方案 > 在 pandas 中使用 str.contains 而不是 .isin

问题描述

如果我的目标是查看一个数据框列中的任何值是否与另一个数据框列中的值匹配,我可以.isin像这样使用:

df1 = pd.DataFrame({'name': ['Marc', 'Jake', 'Sam', 'Brad']})
df2 = pd.DataFrame({'IDs': ['Jake', 'John', 'Marc', 'Tony', 'Bob']})

print(df1.assign(In_df2=df1.name.isin(df2.IDs).astype(int)))

Output:
   name  In_df2
0  Marc       1
1  Jake       1
2   Sam       0
3  Brad       0 

但是,如果我不想要完全匹配并且想要避免循环,有没有办法用.isin替换str.contains()?像这样的东西?

print(df1.assign(In_df2=df1.name.str.contains(df2.IDs).astype(int)))

现在这返回:

TypeError: unhashable type: 'Series'

谢谢!

标签: pythonpandas

解决方案


使用这样的正则表达式:

pattern = fr"(?:{'|'.join(df2['IDs'])})"

df1['In_df2'] = df1['name'].str.contains(pattern).astype(int)

输出:

>>> df1
        name  In_df2
0       Marc       1
1       Jake       1
2        Sam       0
3       Brad       0

>>> pattern
'(?:Jake|John|Marc|Tony|Bob)'

推荐阅读