清理一个pandas系列:对于每一行,如果字符串在字典的值(values = list或set)中,则用key替换

问题描述 投票:0回答:1

我有一本书,我已经分解为每个角色的对话,但我注意到有相同的字符有很多拼写错误和不同的名字。我创建了一个字典,希望将每个别名关联回正确的字符,但我执行起来很麻烦。这是我的熊猫系列和所需的输出:

Narrator ---> Output

Robert -----> Robert
Dan    -----> Dan
Daniel -----> Daniel
Robbie -----> Robert
Rob    -----> Robert
Jacob  -----> Jacob

我的字典如下:

char_dict = {'Robert': ['Robert', 'Robbie', 'Rob'],
             'Daniel': ['Daniel', 'Dan']}
  1. 如果字符串在字典中的值列表中,我将如何用键替换它。我需要翻转我的字典吗?
  2. 我可以使用set而不是字典中的列表执行相同的操作吗? char_dict = {'Robert':{'Robert','Robbie','Rob'},'Daniel':{'Daniel','Dan'}}

我已经使用过这段代码,它确实让我得到了一个工作输出,但很难快速查看并理解哪些名称与哪个字符相关联。有更有效的方法吗?

new_char_dict = {k: oldk for oldk, oldv in char_dict.items() for k in oldv}
pandas dictionary data-cleaning
1个回答
0
投票

是的我会反驳这个词:

rev = {c:k for k, v in char_dict.items() for c in v}

如果原始字典值是列表或集合(或元组),则此字典理解将起作用。

然后将其映射到列:

df["Output"] = df["Narrator"].map(rev)

这对我来说似乎是最有效的方法。但是,如果您主要关心的是使代码尽可能具有人类可读性,那么您可以将字典理解分解为标准for循环:

alias_to_name = dict()
for char_name, list_of_aliases in char_dict.items():
    for char_alias in list_of_aliases:
        alias_to_name[char_alias] = char_name

df["Output"] = df["Narrator"].map(alias_to_name)

但这只是做同样的事情 - 我会争辩 - 不那么优雅的代码。

© www.soinside.com 2019 - 2024. All rights reserved.