Панды: условно заменить набором - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть набор общих адресов электронной почты, например:

common_addresses = set(["yahoo.com", "gmail.com", "hotmail.com"])

У меня есть Pandas DataFrame, df, который выглядит так:

id email_domain
1  yahoo.com
2  gmail.com
3  unk.com
4  new.com

Я хочузамените электронные письма, которых нет в моем common_addresses, на "редкие".Вот моя попытка:

mask = df.email_domain not in common_addresses
df.loc[mask, "email_domain"] = "rare"

Я получаю сообщение об ошибке в строке mask = ... следующим образом:

TypeError: 'Series' objects are mutable, thus they cannot be hashed

Как мне создать эту маску?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Другой способ - использовать

df['email_domain'] = df.email_domain.where(df.email_domain.isin(common_addresses), 'rare')

df

Вывод:

   id email_domain
0   1    yahoo.com
1   2    gmail.com
2   3         rare
3   4         rare
0 голосов
/ 25 апреля 2018

Ты почти у цели.Для серии вы хотите использовать .isin() для проверки членства.В вашем случае вы должны изменить свой код на:

mask = ~df.email_domain.isin(common_addresses)
df.loc[mask, "email_domain"] = "rare"

Кроме того, вам нужно использовать оператор ~ (вместо not) для работы с Series.

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