Pandas серия заменяет значение без учета регистра, но только при точном совпадении - PullRequest
1 голос
/ 18 июня 2020

Как сказано в заголовке, я ищу идеальное решение для замены точной строки в серии без учета регистра.

ls = {'CAT':'abc','DOG' : 'def','POT':'ety'}

d = pd.DataFrame({'Data': ['cat','dog','pot','Truncate','HotDog','ShuPot'],'Result':['abc','def','ety','Truncate','HotDog','ShuPot']})
d

В приведенном выше коде ref содержит пару "ключ-значение", где ключ - это существующее значение в столбце фрейма данных, а значение - это значение, которое нужно заменить.

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

ожидаемый результат сохраняется в столбце результатов.

Я попытался включить re.ignore = True, который изменяет последние 2 значения. следующий код, но он работает не так, как ожидалось. он также преобразует значения в верхний регистр из предыдущей итерации.

for k,v in ls.items():
    print (k,v)
    d['Data'] = d['Data'].astype(str).str.upper().replace({k:v})
print (d)

Буду признателен за любую помощь.

1 Ответ

3 голосов
/ 18 июня 2020

Создайте серию сопоставлений из данного словаря, затем преобразуйте индекс серии сопоставлений в нижний регистр, затем, используя Series.map сопоставьте значения в столбце Data со значениями сопоставлений, затем используйте Series.fillna, чтобы заполнить отсутствующие значения в сопоставленной серии:

mappings = pd.Series(ls)
mappings.index = mappings.index.str.lower()
d['Result'] = d['Data'].str.lower().map(mappings).fillna(d['Data'])

# print(d)

       Data    Result
0       cat       abc
1       dog       def
2       pot       ety
3  Truncate  Truncate
4    HotDog    HotDog
5    ShuPot    ShuPot
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...