【问题标题】:How to apply regex for multiple values to create a new column in pandas?如何对多个值应用正则表达式以在熊猫中创建新列?
【发布时间】:2021-06-01 21:52:22
【问题描述】:

我有一个如下图所示的数据框

import pandas as pd
import numpy as np
df=pd.DataFrame({'s_id':[1,2,3,4,5,6,7,8],
                'test':['Metformin','Glipizide','Gliclazide','Glibenclamide','Repaglinide','nateglinide','sitagliptin','linagliptin']})

我想根据以下条件根据test 列中的值创建一个名为op 的新列

如果test 值包含*etformi* 模式,那么op 列应该有一个值C1

如果test 值包含gli* 模式,那么op 列应该有一个值C2

如果test 值包含*nide 模式,那么op 列应该有一个值C3

如果test 值包含*gliptin 模式,那么op 列应该有一个值C4

我尝试了以下方法,但它没有按预期工作,并且不确定如何将它们合并在一起

df['test'].str.contains('metformi*', case=False, regex=True)
df['test'].str.contains(('gli*&&*ide'), case=False, regex=True)
df['test'].str.contains(('*nide'), case=False, regex=True)
df['test'].str.contains(('*gliptin'), case=False, regex=True)

我希望我的输出如下所示

【问题讨论】:

    标签: python regex pandas string dataframe


    【解决方案1】:

    您可以使用numpy.select,提供condlistchoicelist

    import numpy as np
    
    condlist = [
        df['test'].str.contains('etformi', case=False, regex=True),
        df['test'].str.contains(('^gli.*ide$'), case=False, regex=True),
        df['test'].str.contains(('nide$'), case=False, regex=True),
        df['test'].str.contains(('gliptin$'), case=False, regex=True)
    ]
    
    choicelist = ['C1', 'C2', 'C3', 'C4']
    
    df['op'] = np.select(condlist, choicelist)
    

    [出]

       s_id           test  op
    0     1      Metformin  C1
    1     2      Glipizide  C2
    2     3     Gliclazide  C2
    3     4  Glibenclamide  C2
    4     5    Repaglinide  C3
    5     6    nateglinide  C3
    6     7    sitagliptin  C4
    7     8    linagliptin  C4
    

    【讨论】:

    • 如果test 列中有一个不匹配任何模式的条目,那么op 列中将分配什么。它将为空?从手机打字,所以无法尝试
    • 您可以在np.select 函数中设置默认值。默认为0,但您也可以选择default=np.nan
    • 是否可以为单个条件提供多个这样的模式? ('Glimepiride|Tolbutamide|Glipizide|Glucotrol|Glyburide)
    • 应该没问题
    猜你喜欢
    • 2019-10-19
    • 1970-01-01
    • 2021-11-06
    • 1970-01-01
    • 2018-08-04
    • 2021-05-30
    • 2021-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多