代码之家  ›  专栏  ›  技术社区  ›  Rahul Agarwal

从pandas列获取list元素的匹配值

  •  0
  • Rahul Agarwal  · 技术社区  · 7 年前

    样本输入df

    Region     Name
    Europe     Project-Europe
    Unknown    Project_Mexico
    Unknown    Project USA
    Unknown    Project
    Paraguay   Project
    

    预期DF

    Region     Name                   New_Region
    Europe     Project_Europe         Europe
    Unknown    Project_Mexico         Mexico
    Unknown    Project-USA            USA
    Unknown    Project                Unknown
    Paraguay   Project                Paraguay
    

    样品清单

    country_list= ['USA','MEXICO','Europe']
    

    代码: (部分工作)

    pattern = '|'.join(country_list).lower()
    df['New_Region'] = ariba_df['Name'].str.lower().str.contains(pattern)
    

    问题陈述

    1. 以上代码构成一个新列 New_Region 但是给予 True False ,我需要与预期输出中所示匹配的值。
    2. 只有在 Region 未知列
    0 回复  |  直到 7 年前
        1
  •  3
  •   jezrael    7 年前

    使用 Series.str.extract 具有 re.I 对于忽略案件 fillna 以下内容:

    最后添加 numpy.where 对于仅通过布尔掩码设置值:

    import re
    
    country_list= ['USA','MEXICO','Europe']
    
    pattern = '|'.join(country_list)
    mask = df['Region'] == 'Unknown'
    
    s = (df['Name'].str.extract('(' + pattern + ')', flags=re.I, expand=False)
                       .fillna('Unknown'))
    
    df['New_Region'] = np.where(mask, s, df['Region'])
    print (df)
    
         Region            Name New_Region
    0    Europe  Project-Europe     Europe
    1   Unknown  Project_Mexico     Mexico
    2   Unknown     Project USA        USA
    3   Unknown         Project    Unknown
    4  Paraguay         Project   Paraguay