1

所以首先我有一个字符数据框,它有一个名为 name 的列,包含 100 多人的全名。

例如,姓名:Johnathan Jay Smith、Harold Robert Doe、Katie Holt。

然后我有一个独特昵称的列表,例如,[Mr. 多伊、凯蒂阿姨、约翰]

需要注意的是,它们的顺序并不相同,并不是每个有昵称的人都在全名列表中,也不是每个全名列表中的人都在昵称列表中。我将删除最后没有匹配值的行。

我的问题:有没有一种方法可以让 python 逐项阅读这两个列表,并为每个匹配的人匹配 John 和 Johnathan Jay Smith?基本上,如果昵称作为整个名称的一部分出现,我可以在现有的字符数据框中添加一个昵称列,而无需为超过 100 人手动执行此操作吗?

提前谢谢你,我什至不知道从哪里开始!

4

1 回答 1

0

这是非常直接的,并且不考虑拼写变体

from itertools import product

names = ['Johnathan Jay Smith', 'Harold Robert Doe', 'Katie Holt']
nicknames = ["Mr. Doe", "Aunt Katie", "John"]

def match_nicknames(names, nicknames):
    splitted_names = [n.split(' ') for n in names]
    splitted_nn = [n.split(' ') for n in nicknames]
    matches = []
    for name in splitted_names:
        name_pairs = product(name, splitted_nn)
        matched = filter(lambda x: any([nn in x[0] for nn in x[1]]), name_pairs)
        if matched:
            matches += [(" ".join(name), " ".join(nn)) for name_part, nn in matched]
    return matches

match_nicknames(names, nicknames)
>> [('Johnathan Jay Smith', 'John'),
    ('Harold Robert Doe', 'Mr. Doe'),
    ('Katie Holt', 'Aunt Katie')]
于 2021-08-12T20:53:55.067 回答