python - 在 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'
谢谢!
解决方案
使用这样的正则表达式:
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)'
推荐阅读
- electron - 如何解压由 Electron pack 生成的单个 EXE 文件?
- ios - 带边框和阴影的圆形按钮
- javascript - WebRTC 网络摄像头约束不适应设备方向
- c++ - 我应该初始化抽象类的成员吗?
- node.js - 如何用passport-ldapauth做一个ldap认证服务
- javascript - 如何让变量在一次更改后变得不可变?
- rxjs - store dispatch 多次调用效果的http get
- eclipse - SVN 关键字文件在切换修订后不更新
- angular - 从 amcharts 工具提示中删除填充
- oracle - 将列的数据与公差匹配