检查字符串列表中的字符串是否在Pandas DataFrame列中

时间:2019-05-16 13:50:32

标签: python string pandas

我是Python的新手,并且有一个关于将列表中的字符串与df中的列进行匹配的问题。

当我运行以下命令时,我希望创建一个名为“匹配”的新列,并且如果列表中的字符串与该列中的字符串之间存在匹配,则“匹配”列中的值相应的行应为True,如果不匹配,则为False。期望的结果将是False,False,True,False,False。由于字符串“ Honda”与“ Honda Civic”不完全匹配,因此不应为True。与“玩具”相同不是“丰田花冠”的完全匹配。

创建df:

Cars = {'Brand': ['Honda Civic','Toyota Corolla','Ford Focus','Audi A4', np.nan],
    'Price': [22000,25000,27000,35000, 29000],
    'Liscence Plate': ['ABC 123', 'XYZ 789', 'CBA 321', 'ZYX 987', 'DEF 456']}

df = DataFrame(Cars,columns= ['Brand', 'Price', 'Liscence Plate'])

然后,我创建一个要搜索的值的列表,并由|组成。

search_for_these_values = ['Honda', 'Toy', 'Ford Focus', 'Audi A4 2019']
pattern = '|'.join(search_for_these_values)

在这里,我尝试了str.match命令,并给出了True,True,True,False,False。

df['Match'] = df["Brand"].str.match(pattern, na=False)

在这里,我使用==运算符创建了一个循环,并指定了False,False,False,False,False。

for i in range(0,len(pattern)):
    df['Match'] = df['Brand'] == pattern[i]

谢谢您的帮助!

1 个答案:

答案 0 :(得分:1)

如果列表中需要匹配值,请使用Series.isin

df['Match'] = df["Brand"].isin(search_for_these_values)
print (df)
            Brand  Price Liscence Plate  Match
0     Honda Civic  22000        ABC 123  False
1  Toyota Corolla  25000        XYZ 789  False
2      Ford Focus  27000        CBA 321   True
3         Audi A4  35000        ZYX 987  False
4             NaN  29000        DEF 456  False

带有match的解决方案用于检查子字符串,因此输出不同。

带有Series.str.contains和参数na=False的匹配子字符串的替代解决方案:

df['Match'] = df["Brand"].str.contains(pattern, na=False)
print (df)
            Brand  Price Liscence Plate  Match
0     Honda Civic  22000        ABC 123   True
1  Toyota Corolla  25000        XYZ 789   True
2      Ford Focus  27000        CBA 321   True
3         Audi A4  35000        ZYX 987  False
4             NaN  29000        DEF 456  False

编辑:

对于子字符串中的测试值,可以使用列表理解,使用search_for_these_values中的值进行循环,并通过inany进行测试匹配,以返回至少一个True:< / p>

df['Match'] = [any(x in z for z in search_for_these_values) 
                                if x == x 
                                else False 
                                for x in df["Brand"]]
print (df)

            Brand  Price Liscence Plate  Match
0     Honda Civic  22000        ABC 123  False
1  Toyota Corolla  25000        XYZ 789  False
2      Ford Focus  27000        CBA 321   True
3         Audi A4  35000        ZYX 987   True
4             NaN  29000        DEF 456  False