我正在编写一个Python函数,该函数接受输入并显示来自数据框的所有匹配值,但我没有从包含单个引号(撇号)的输入中获得任何结果
数据框架包含如下值:Mo' nique, Thaddeus O' sullivan, Nancy O' dell,我无法通过输入相应的名称来匹配这些值。
我尝试用.replace("'", "'")
来逃避单引号,但是没有成功。
谢谢你的帮助。
注意:我解析了两次值。第一次搜索匹配项时,如果没有找到,则将值规范化并在打印name not found之前再次搜索。
import pandas as pd
def get_name():
request_name = input("Type a name: ")
request_name = request_name.lower().title().strip()
search = False
for value in df['NameColumn']:
if request_film in value:
search = True
if not search:
df['NameColumn'] = (
df['NameColumn'].str.normalize('NFKD').str.encode(
'ascii', errors='ignore').str.decode('utf-8'))
for value in df['NameColumn']:
if request_name in value:
search = True
if search:
name_data = df.loc[(df['NameColumn'].str.contains(request_name))]
print(name_data)
else:
print("name not found")
df中的单引号可能是非ascii字符。如果是这种情况,那么您可以使用Unidecode
包将Unicode字符转换为等效的ASCII字符。你可以试试:
from unidecode import unidecode
request_name = 'O'Dell'
for value in df['NameColumn']:
value = unidecode(value)
if request_name in value :
print(True)
else :
print(False)
则得到:
False
True
False
实际上,我已经发现了.title()
方法中的问题。
.title()
方法将包含撇号的单词视为单独的单词,因此:
request_name = input('Type a name: ') #america's
request_name = request_name.lower().title().strip()
print(request_name) #America'S
America'S
当然不匹配America's
,它在我的dataframe
中。
解决方案1(使用.lower()
):我将.lower()
方法应用于两者(dataframe
和输入的副本)。这样我就可以准确地比较两者
方案2(使用regex
):
这个解决方案,建议使用正则表达式来绕过这个问题。