我在下面的pandas列中。我需要将包含“过敏反应”一词的单元格转换为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
答案 0 :(得分:3)
使用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
答案 1 :(得分:1)
您可以使用pd.Series.str.contains
代替正则表达式。此方法返回一个布尔序列,然后我们将其转换为int
。
df['Name']= df['Name'].str.contains('anaphylaxis', case=False, regex=False)\
.astype(int)
结果:
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