【问题标题】:Check if String in List of Strings is in Pandas DataFrame Column检查字符串列表中的字符串是否在 Pandas DataFrame 列中
【发布时间】:2019-10-03 19:50:44
【问题描述】:

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

当我运行以下命令时,我希望创建一个名为“Match”的新列,如果列表中的字符串与列中的字符串匹配,则“Match”列中的值并且对应的行应该是True,如果不匹配,则为False。期望的结果是假、假、真、假、假。由于字符串“Honda”与“Honda Civic”不完全匹配,因此它不应该为 True。与“Toy”相同的不是“Toyota Corolla”的完全匹配。

创建 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]

感谢您的帮助!

【问题讨论】:

  • 你在找isin:df.Brand.isin(search_for_these_values)
  • 太好了,感谢您的帮助!

标签: python string pandas


【解决方案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

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

【讨论】:

  • 好的,非常感谢您的帮助!另一个快速的问题,如果我想在 search_for_these_values 中的整个字符串在列中的字符串内时显示 true,我将使用哪个命令。例如。字符串“Audi A4 2019”显示 True,因为整个“Audi A4”字符串都在“Audi A4 2019”内。期望的结果是假、假、真、真、假。
  • 嗯,看起来更复杂。
  • @BradKlassen - 添加解决方案来回答。
  • 非常感谢您的帮助,非常感谢!
猜你喜欢
  • 2013-08-01
  • 1970-01-01
  • 2013-01-09
  • 1970-01-01
  • 2017-10-31
  • 2013-04-29
  • 1970-01-01
相关资源
最近更新 更多