BKl*_*sen 11 python string pandas
我是 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'])
Run Code Online (Sandbox Code Playgroud)
然后,我创建一个我想要搜索的值的列表,并用 | 连接。
search_for_these_values = ['Honda', 'Toy', 'Ford Focus', 'Audi A4 2019']
pattern = '|'.join(search_for_these_values)
Run Code Online (Sandbox Code Playgroud)
在这里,我尝试了 str.match 命令,并给出了 True、True、True、False、False。
df['Match'] = df["Brand"].str.match(pattern, na=False)
Run Code Online (Sandbox Code Playgroud)
在这里,我使用 == 运算符创建了一个循环,并给出了 False、False、False、False、False。
for i in range(0,len(pattern)):
df['Match'] = df['Brand'] == pattern[i]
Run Code Online (Sandbox Code Playgroud)
感谢您的帮助!
如果需要匹配列表中的值,请使用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
Run Code Online (Sandbox Code Playgroud)
解决方案 withmatch用于检查子字符串,因此输出不同。
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
Run Code Online (Sandbox Code Playgroud)
编辑:
对于子字符串中的测试值,可以使用列表理解与循环中的值search_for_these_values并测试匹配通过in与any返回至少一个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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11389 次 |
| 最近记录: |