【问题标题】:Replacing values from two columns when they are similar当它们相似时替换两列中的值
【发布时间】:2019-09-20 10:32:22
【问题描述】:

我有 2 列; 名称品牌名称。第一列包含产品名称等值,而第二列是产品的品牌名称。在某些情况下,它们的名称相似 - 例如,可口可乐。

在上图中,您可以确切地看到我在说什么。我将留下一段代码用于测试目的:

data = [['Coca Cola', 'Coca Cola'], ['Coca Cola cherry', 'Coca Cola'], ['Coca Cola life', 'Coca Cola'], ['Coca Cola Life', 'Coca Cola']]
testdf = pd.DataFrame(data, columns = ['Name', 'BrandName'])

每当产品名称包含与品牌名称相同的单词时,我尝试将列 BrandName 中的每个值都设置为“未知”。以上图为例。我只能使用以下代码将第一行的品牌名称设置为“未知”:

testdf["BrandName"] = np.where(testdf["Name"] == testdf["BrandName"], "Unknown", testdf["BrandName"])

但是,我还没有弄清楚如何设置条件,所以当 Name 包含列 BrandName 的全部内容时,后者的值变为 "未知”。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您可以将自定义 lambda 函数从 this 传递给 np.where

    import re
    
    f = lambda x: bool(re.search(r'\b{}\b'.format(x['BrandName']), x['Name']))
    
    testdf['match'] = np.where(testdf.apply(f, axis = 1), "Unknown", testdf["BrandName"])
    print (testdf)
                   Name  BrandName    match
    0         Coca Cola  Coca Cola  Unknown
    1  Coca Cola cherry  Coca Cola  Unknown
    2    Coca Cola life  Coca Cola  Unknown
    3    Coca Cola Life  Coca Cola  Unknown
    

    【讨论】:

      【解决方案2】:

      这是使用maskapply 的一种方式:

      testdf['BrandName'] = (testdf.BrandName.mask(testdf.apply(
                                                   lambda x: x.BrandName in x.Name, axis=1), 
                                                   'Unkown'))
      
                 Name      BrandName
      0         Coca Cola    Unkown
      1  Coca Cola cherry    Unkown
      2    Coca Cola life    Unkown
      3    Coca Cola Life    Unkown
      ​
      

      【讨论】:

        猜你喜欢
        • 2021-04-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-03
        • 2022-01-16
        • 2020-02-18
        • 1970-01-01
        • 2021-09-03
        相关资源
        最近更新 更多