Python:如何从包含单引号(撇号)的输入中匹配数据框中的值?



我正在编写一个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):

这个解决方案,建议使用正则表达式来绕过这个问题。

最新更新