Очистить серию панд: для каждой строки, если строка находится в значениях (значения = список или набор) словаря, заменить на ключ - PullRequest
0 голосов
/ 01 марта 2019

У меня есть книга, которую я разбил на диалог для каждого персонажа, однако я заметил, что есть много опечаток и разных имен для одних и тех же персонажей.Я создал словарь, надеясь связать каждый псевдоним с нужным символом, но у меня возникают проблемы при выполнении.Вот моя серия Панд и желаемый результат:

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 голосов
/ 01 марта 2019

Да, я бы просто изменил диктовку:

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)

Но это просто делает то же самое в-IСкорее всего, изящный код.

...