首页 > 解决方案 > 将 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

标签: pythonregexpandasseries

解决方案


用于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

推荐阅读