python - 将 pandas 中的正则表达式值转换为 0 或 1
问题描述
我有下面的熊猫专栏。我需要将包含单词“过敏反应”的单元格转换为 1,将不包含单词的单元格转换为 0。
直到现在我已经尝试过,但是缺少一些东西
df['Name']= df['Name'].replace(r"^(.(?=anaphylaxis))*?$", 1,regex=True)
df['Name']= df['Name'].replace(r"^(.(?<!anaphylaxis))*?$", 0, regex=True)
ID Name
84 Drug-induced anaphylaxis
1041 Acute anaphylaxis
1194 Anaphylactic reaction
1483 Anaphylactic reaction, due to adverse effect o...
2226 Anaphylaxis, initial encounter
2428 Anaphylaxis
2831 Anaphylactic shock
4900 Other anaphylactic reaction
解决方案
用于str.contains
不区分大小写的匹配。
import re
df['Name'] = df['Name'].str.contains(r'anaphylaxis', flags=re.IGNORECASE).astype(int)
或者,更简洁地说,
df['Name'] = df['Name'].str.contains(r'(?i)anaphylaxis').astype(int)
df
ID Name
0 84 1
1 1041 1
2 1194 0
3 1483 0
4 2226 1
5 2428 1
6 2831 0
7 4900 0
contains
当您还想执行基于正则表达式的匹配时很有用。regex=False
尽管在这种情况下,您可以通过添加更多性能来完全摆脱正则表达式。
但是,为了获得更高的性能,请使用列表推导。
df['Name'] = np.array(['anaphylaxis' in x.lower() for x in df['Name']], dtype=int)
甚至更好,
df['Name'] = [1 if 'anaphylaxis' in x.lower() else 0 for x in df['Name'].tolist()]
df
ID Name
0 84 1
1 1041 1
2 1194 0
3 1483 0
4 2226 1
5 2428 1
6 2831 0
7 4900 0
推荐阅读
- ios - 如何在快速关闭控制器时在每个屏幕上显示自定义视图?
- c - 使用 fscanf 仅读取 C 中的字母
- asp.net-core - 来自输入标签助手的强类型引用
- javascript - Javascript 方法 requestFullscreen() 隐藏页面中的正文元素
- angular - 需要在打字稿中过滤和第一个匹配对象数组的元素吗?
- flutter - 使用convex_bottom_bar包在flutter中渲染来自提供者的ConvexAppBar Badge数据
- azure - Azure AD b2c 自定义策略:更改用户配置文件图片
- python - Python Kivy App 无法在第二台机器上运行
- odoo - 如何从 qweb 打开 url 链接?
- mysql - 在 MYSQL 5.7 中创建存储过程