Замена нескольких имен значений в панде - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть столбец colA, который имеет несколько значений в кадре данных pandas.Я хочу, чтобы каждое значение, начинающееся с spare1 в этом столбце, было заменено словами email_petition.например, spare1signed, spare1not подписано и т. д. и т. д. будет преобразовано в email_petition.

. Я использую следующий код:

petition = df.colA.str.startswith('spare1')

if df.colA == petition:
    df.colA.replace(petition, 'email_petition', inplace=True)

, но получаю следующееОшибка: Истинное значение Серии неоднозначно.Используйте a.empty, a.bool(), a.item(), a.any() или a.all().

Я также попробовал следующий код, который не выдает ошибку, но, кажется, не работает какзначения не меняются:

petition = df.colA.str.startswith('spare1')

if df.colA is petition:
    df.colA.replace(petition, 'email_petition', inplace=True)

хотел бы получить совет по этому поводу!

спасибо

Ответы [ 3 ]

0 голосов
/ 22 ноября 2018

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

df = pd.DataFrame({'colA':['spare1signed','spare1not signed','no action']})
df.colA = df.colA.apply(lambda x: 'email_sent' if 'spare1' in x else x)
df

>>
    colA
0   email_sent
1   email_sent
2   no action

Здесь мы назначаем столбцу лямбда-функцию, которая заменяет любое значение в столбце, если spare1 найдено с email_sent.

0 голосов
/ 22 ноября 2018

Это можно упростить с помощью replace с использованием шаблона регулярного выражения:

Заимствовать данные из @ BernardL

Пример DataFrame с именем столбца colA:

>>> df
               colA
0      spare1signed
1  spare1not signed
2         no action

Применение метода регулярных выражений, который говорит, что все заканчивается на signed$ Просто замените их на email_sent:

Результат:

>>> df['colA'] = df.colA.replace(r'.*signed$', 'email_sent', regex=True)
>>> df
         colA
0  email_sent
1  email_sent
2   no action

Regex Значение:

.* соответствует любому символу (кроме ограничителей строки)

* Quantifier - Сопоставляется от нуля до неограниченного количества раз, столько разпо возможности, возвращая по мере необходимости (жадный)

signed соответствует буквально подписанным символам (с учетом регистра)

$ устанавливает позицию в конце строки

0 голосов
/ 22 ноября 2018

Попробуйте:

df.colA.replace({'spare1':'email_petition'}, regex=True)

Для полного удаления:

df['colA'].replace({'spare1signed':'email_petition','spare1notsigned':'email_petition'})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...