Панды: Группировка по соответствующей подстроке в столбце панд - PullRequest
1 голос
/ 05 марта 2019

У меня есть список, который имеет такие элементы, как:

emails= ['xyz.com', 'abc.com','def.com']

Теперь у меня есть кадр данных, который выглядит следующим образом:

ДФ:

UserID    Email_Address
U001      u001@abc.com
U002      u002@xyz.com
U003      u003@xyz.com
U004      u004@abc.com
U004      u005@def.com
U006      u006@def.com
U007      u007@def.com

Я хочу выполнить подсчет по группам на основе подстроки, где подстрока - это элементы из списка.

Следовательно, вывод должен выглядеть следующим образом:

abc.com     2
def.com     3
xyz.com     2

Мой текущий код:

for domain in list1:
    count = df.groupby( [df.Email_Address.str.find(domain)]).sum()

Ответы [ 3 ]

2 голосов
/ 05 марта 2019

Используйте Series.str.extract для получения значений по спискам и агрегирования по GroupBy.size:

pat = '|'.join(emails)
s = df['Email_Address'].str.extract('('+ pat + ')', expand=False)
df1 = df.groupby(s).size().reset_index(name='Count')
print (df1)
  Email_Address  Count
0       abc.com      2
1       def.com      3
2       xyz.com      2
0 голосов
/ 05 марта 2019
def mapf(x):
    if x[x.find('@')+1:] in emails:
        return x[x.find('@')+1:]

data['Email_Address'].apply(mapf).value_counts()  

Функция возвращает None, если строка не совпадает с электронной почтой. Так что она считает только совпадающие.

И вывод будет как:

def.com    3
abc.com    2
xyz.com    2
Name: Email, dtype: int64
0 голосов
/ 05 марта 2019

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

len(df[df['Email_Address'] == your_value])

Так что я думаю, что вы ищете что-то вроде:

for domain in list1:
    len(df[df['Email_Address'] == domain])  # Save this value whatever you want
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...