Python pandas - очистить всю ячейку, если часть текста соответствует шаблону - PullRequest
0 голосов
/ 05 октября 2019

Можно ли вычеркнуть все содержимое ячейки в столбце csv, если часть ее текста соответствует списку шаблонов, и затем вывести результат в csv? Я могу заменить сопоставленный текст пустым, но хотел бы заменить всю ячейку пустым (НЕ удаляя строку).

csv необработанные данные выглядят так:

date   id  subject                        description
9/1/19 342 New customer message 5:23 p.m. blah blah blah
9/4/19 356 need more info                 blah blah blah
9/7/19 378 SCRUBBED review                blah blah blah


import pandas as pd
df = pd.read_csv('C:/Documents/sample.csv', 'r', encoding = 'ISO-8859-1', 
delimiter=',', usecols=[2])
pattern = '|'.join(['SCRUBBED','New customer message’, 'HELLO'])
df['subject'] = df['subject'].str.replace(pattern, '')
df.to_csv('C:/Documents/sample_removed.csv', encoding = 'ISO-8859-1', index=False) 

Ожидаемый результат::

date   id  subject        description
9/1/19 342                blah blah blah
9/4/19 356 need more info blah blah blah
9/7/19 378                blah blah blah

Ответы [ 2 ]

1 голос
/ 05 октября 2019

Проблема здесь в вашем регулярном выражении. Если вы замените строку:

pattern = '|'.join(['SCRUBBED','New customer message’, 'HELLO'])

на:

pattern = '.*' + '.*|.*'.join(['SCRUBBED','New customer message’, 'HELLO']) + '.*'

Это должно работать. str.replace будет заменять только совпадающую часть строки, добавляя. * к началу и концу целевого текста, теперь она будет соответствовать всей ячейке (это может привести к нежелательным вещам, таким как замена строки "OTHELLO" на "", так как онасодержит «HELLO», в этом случае вам нужно более тщательно продумать свое регулярное выражение).

0 голосов
/ 05 октября 2019

Вы можете использовать pd.Series.str.contains, чтобы создать маску , которую вы затем можете проиндексировать для замены.

Индексирование со значениями NaN не будет работать, поэтому вы можете сначала заменить значения NaN в столбце на '' в качестве значения NULL, чтобы столбец представлял собой строку. Таким образом, str.contains будет генерировать только логические значения, которые можно использовать с индексированием.

df['subject'] = df['subject'].fillna('')
is_match = df['subject'].str.contains(pattern, regex=True)
df['subject'][is_match] = ''

Альтернативный подход состоит в том, чтобы не заполнять значения NaN в кадре данных, а вместо этого изменять значения NaN маски либо на Falseили True в зависимости от того, хотите ли вы оставить NaN или заменить его пустой строкой соответственно.

is_match = df['subject'].str.contains(pattern, regex=True)
df['subject'][is_match.fillna(True or False)] = ''

Независимо от подхода, чтобы сохранить очищенные данные, просто используйте метод to_csv.

df.to_csv('filename.csv')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...