【问题标题】:Cleaning a list of names in Python for Data Science为数据科学清理 Python 中的名称列表
【发布时间】:2021-05-01 05:57:52
【问题描述】:

所以我碰巧收到了一个 xlms 文件,其中包含具有不同头衔的个人姓名,例如先生、女士、博士、夫人、法官等。但是其中一些名称在一个名称示例中包含多个头衔,例如“Mr Mrs Ronderval”, “Dr Rev Johns Mr”等。所以我试图删除所有这些,除了一个,因此最终结果应该是 Ronderval 先生或 Ronderval 夫人,Johns 博士或 Rev Johns 或 Johns 先生,其中任何一个都可以。到目前为止,我所做的是将字符串转换为列表列表,例如 name_list = [['Mr','Mrs', 'Ronderval'], ['Dr', 'Rev','Johns', 'Mr']] 并有一个标题列表title=['Mr', 'Ms', 'Dr', 'Mrs', 'Judge','Rev']。因此,我尝试遍历 name_list,从标题中删除所有值,结果显然是“Roderval”和“Johns”,但我希望至少以 Ronderval 先生或 Ronderval 夫人、Johns 博士或 Rev Johns 或 Mr约翰斯。我该怎么办?

这是我使用列表理解的代码

 name_list=[[x for x in l if (x not in title )] for l in name_list] 

【问题讨论】:

  • 请在您的问题中添加更多示例数据,涵盖所有边缘情况。
  • 其他数据样本的名字中可以包含其他尊称,如Judge、Hon、Honourable、Prof等,我只是选择了最受欢迎的,比如标题列表中的那些。这里的想法是在每个名字中只留下一个尊称。不幸的是,这是我们不时处理的杂乱数据类型。另一种情况可能是Elizabeth Jones Prof Miss,如果我想删除教授或小姐并交换它们以使其有意义,则导致Miss Elizabeth JonesProf Elizabeth Jones

标签: python data-science data-cleaning


【解决方案1】:

您可能想在这里尝试set -

result = [[name.intersection(title_list).pop(), name.difference(title_list).pop()] for name in map(set,name_list)]

# output [['Mr', 'Ronderval'], ['Dr', 'Johns']]

【讨论】:

  • 非常感谢 Nk03,这按预期工作。 :)
【解决方案2】:

您可以通过您的姓名列表检查,随时为每个条目查找标题和名称(任何不是标题的)。

例子:

name_list = [['Mr','Mrs', 'Ronderval'], ['Dr', 'Rev','Johns', 'Mr']]
title_list = ['Mr', 'Ms', 'Dr', 'Mrs', 'Judge','Rev']

filtered_name_list = []

for one_entry in name_list:
    title, name = None, None

    for name_or_title in one_entry:
        if name_or_title in title_list:
            title = name_or_title
        else:
            name = name_or_title
        if title and name:
            break

    filtered_name_list.append([title, name])

print(filtered_name_list)

输出:

[['Mrs', 'Ronderval'], ['Rev', 'Johns']]

【讨论】:

  • 谢谢@rhurwitz,这也能按预期工作,但只是简单的问题,你是如何让你的输出包含Rev而不是博士或先生提前谢谢:)跨度>
  • 根据您的观点,这可能是我的示例的错误或功能。 ;^) 我的内部for 循环在它同时具有标题和名称时退出,但每次通过循环它都会重新分配title 直到它到达name。因此,它总是抓取条目中紧接在名称之前的标题。
【解决方案3】:

这对我有用:

name_list_all = [['Mr','Mrs', 'Ronderval'], ['Dr', 'Rev','Johns', 'Mr']]
title=['Mr', 'Ms', 'Dr', 'Mrs', 'Judge','Rev']
name_list=[[x for x in l if (x not in title )] for l in name_list_all]
title_list =[[x for x in l if (x  in title )] for l in name_list_all]

[x.append(y[0]) for x,y in zip(name_list,title_list)]
print(name_list)

编辑: 更正代码

【讨论】:

  • 您好,感谢您的回复,当我在笔记本上尝试此操作时,它会返回一个无列表,即 [无,无],我可能会遗漏一些东西
  • 那是我的错,append() 没有返回修改后的列表,我粘贴了我的第一次尝试,当时没有运行。
  • 感谢这也是一个很好的解决方案,只是提醒其他可能需要实施此解决方案的人,在解决方案输出时需要交换字符串[['Ronderval', 'Mr'], ['Johns', 'Dr']]
  • 正确,如果您首先想要标题,则需要稍微更改语法。
猜你喜欢
  • 1970-01-01
  • 2018-12-24
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 2019-08-05
  • 2020-03-02
  • 2019-05-07
  • 2021-06-03
相关资源
最近更新 更多