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

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
Prish 18 Июн 2020 в 20:52

1 ответ

Лучший ответ

Создайте серию сопоставлений из данного словаря, затем преобразуйте индекс серии сопоставлений в нижний регистр, затем используя 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
3
Shubham Sharma 18 Июн 2020 в 18:19