清理熊猫系列:对于每一行,如果字符串在字典的值(值=​​列表或集合)中,则用键替换

时间:2019-03-01 15:42:19

标签: pandas dictionary data-cleaning

我有一本书,我将每个角色细分为对话,但是我注意到同一角色有很多错别字和不同的名字。我创建了一个词典,希望将每个别名重新关联到正确的字符,但是执行时遇到困难。这是我的熊猫系列和所需的输出:

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. 我可以使用集合而不是字典中的列表来执行相同的操作吗?

    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}

1 个答案:

答案 0 :(得分: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)

但是,这只是在做同样的事情-我会争辩更少的优雅代码。