在两列相似时替换两列中的值

时间:2019-09-20 10:32:22

标签: python pandas

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

enter image description here

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

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 列中的每个值都设置为“ Unknown”。以上面的图片为例。我只能使用以下代码将第一行的品牌名称设置为“未知”:

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

但是,我还没有弄清楚如何设置条件,因此当名称包含 BrandName 列的全部内容时,后者的值将变为“未知”。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

这是使用SELECT COUNT(LEVEL) AS number, LEVEL, user, department FROM table WHERE LEVEL ='3' AND TIMESTAMP>= 1500098552 AND TIMESTAMP<= 1568000152 GROUP BY user,department,LEVEL ORDER BY number DESC mask的一种方法:

apply