Как можно использовать несколько регулярных выражений для очистки содержимого столбца в pandas? - PullRequest
0 голосов
/ 24 февраля 2020

Я хочу установить несколько регулярных выражений, которые при совпадении должны заменяться определенным значением. Например, я пишу регулярное выражение re.search('QuickPay with Zelle payment to *', re.IGNORECASE), и в случае совпадения в столбце DataFrame я хочу заменить его на «Payment to *». Я хочу иметь несколько таких пар ключей-значений регулярных выражений.

В качестве практического примера, если столбец имеет «QuickPay с Zelle payment to Zack», его следует заменить на «Payment to Zack». Если в столбце указано «QuickPay с платежом Zelle от Zack», его следует заменить на «Payment from Zack». Если есть совпадение для *DD BR*, его следует заменить на «Пончики Данкина» и несколько таких случаев. Я хочу, чтобы это было сделано автоматически, где я могу просто добавить к парам ключ-значение и затем улучшить свою функцию очистки.

Я пытался использовать df.apply() и df.replace(), но не знал, куда go оттуда.

Вот соответствующий код:

import pandas as pd
import re

filterMap = {
    re.search('QuickPay with Zelle payment to ', re.IGNORECASE): 'Payment to',
    re.search('QuickPay with Zelle payment from ', re.IGNORECASE): 'Payment from'
}

df = pd.read_csv('./data/data.csv', header=None, skiprows=[0], usecols=[1, 2, 3])

date = df[1]
amount = df[3]
title = df[2]

cleanTitle = title.replace(to_replace=filterMap, value=filterMap)

print(cleanTitle)

Ответы [ 3 ]

0 голосов
/ 24 февраля 2020

Создана универсальная c функция, в которой вы можете добавить больше условий в метод re.sub (). Надеюсь, это поможет.

def replace_clean(text):
 text1 = re.sub('QuickPay with Zelle payment to','Payment to',text)
 text1 = re.sub('QuickPay with Zelle payment from','Payment from',text1)
 text1 = re.sub('DD BR','Dunkin Donuts',text1)
 return text1
df['cleanTitle'] = df['title'].map(lambda x: replace_clean(x))
0 голосов
/ 24 февраля 2020

Просто используйте replace

replace_map = {
    '[Q|q]uick[P|p]ay with [Z|z]elle payment to ': 'Payment to',
    '[Q|q]uick[P|p]ay with [Z|z]elle payment from ': 'Payment from'
}

КОД

df.replace({'title': replace_map}, regex=True, inplace=True)

ВЫХОД

>>> df
                               title
0    QuickPay with Zelle payment to 
1    quickPay with zelle payment to 
2    quickpay with zelle payment to 
3  QuickPay with Zelle payment from 
4  Quickpay with zelle payment from 

>>> replace_map = {
...     '[Q|q]uick[P|p]ay with [Z|z]elle payment to ': 'Payment to',
...     '[Q|q]uick[P|p]ay with [Z|z]elle payment from ': 'Payment from'
... }
>>> df.replace({'title': replace_map}, regex=True, inplace=True)
>>> df
          title
0    Payment to
1    Payment to
2    Payment to
3  Payment from
4  Payment from
0 голосов
/ 24 февраля 2020

Рассмотрим пример, в котором вы хотите заменить все вхождения шаблона в вашем df[2]. Вы можете попробовать следующий код,

import pandas as pd

filterMap = {
    'QuickPay with Zelle payment to ': 'Payment to',
    'QuickPay with Zelle payment from ': 'Payment from'
}

df = pd.read_csv('./data/data.csv', header=None, skiprows=[0], usecols=[1, 2, 3])

for k, v in filterMap.items():
    df[2] = df[2].str.replace(k, v)
...