【问题标题】:Convert regex values in pandas to 0 or 1将 pandas 中的正则表达式值转换为 0 或 1
【发布时间】:2018-12-02 23:36:24
【问题描述】:

我有下面的熊猫专栏。我需要将包含单词“过敏反应”的单元格转换为 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

【问题讨论】:

    标签: python regex pandas series


    【解决方案1】:

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

    【讨论】:

    • 这是我需要的。谢谢!
    【解决方案2】:

    您可以使用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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-14
      • 2016-01-03
      • 2011-10-02
      • 2016-04-02
      • 1970-01-01
      • 2019-05-11
      • 2014-11-08
      • 2017-12-29
      相关资源
      最近更新 更多