как заменить символы в фрейме данных, где столбец может иметь записи разных типов данных

#python #regex #pandas

#python #регулярное выражение #pandas

Вопрос:

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

 import pandas as pd

def test_me(text):
    replacements = [("ID", ""),("u", "a")] # 
    return [text.replace(a, b) for a, b in replacements if type(text) == str]

cars = {'Brand': ['HonduIDCivic', 1, 3.2,'CarIDA4'],
        'Price': [22000,25000,27000,35000]
        }

df = pd.DataFrame(cars, columns = ['Brand', 'Price'])
df['Brand'] = df['Brand'].apply(test_me)
 

в результате

     Brand                       Price
0   [HonduCivic, HondaIDCivic]  22000
1   []                          25000
2   []                          27000
3   [CarA4, CarIDA4]            35000
 

вместо

     Brand                       Price
0   HondaCivic                  22000
1   1                           25000
2   3.2                         27000
3   CarA4                       35000
 

Ценю любые предложения!

Ответ №1:

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

 import re
#...
def test_me(text):
    replacements = dict([("ID", ""),("u", "a")])
    if type(text) == str:
        return re.sub("|".join(sorted(map(re.escape, replacements.keys()),key=len,reverse=True)), lambda x: replacements[x.group()], text)
    else:
        return text
 

"|".join(sorted(map(re.escape, replacements.keys()),key=len,reverse=True)) Часть создаст регулярное выражение из re.escape общих ключей словаря, начиная с самого длинного, чтобы избежать проблем при обработке вложенных поисковых фраз, которые имеют один и тот же префикс.

Тест Pandas:

 >>> df['Brand'].apply(test_me)
0    HondaCivic
1             1
2           3.2
3         CarA4
Name: Brand, dtype: object