将大熊猫中的正则表达式值转换为0或1

时间:2018-06-23 23:13:06

标签: python regex pandas series

我在下面的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

2 个答案:

答案 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