Pandas: Groupby на основе совпадающей подстроки в столбце pandas

#python #pandas #dataframe #group-by

#python #pandas #фрейм данных #группировка по

Вопрос:

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

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

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

df:

 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
  

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

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

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

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

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

Комментарии:

1. В чем ваш вопрос? Что здесь не так или какой результат вы получаете в данный момент?

Ответ №1:

Используется 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
  

Ответ №2:

 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
  

Ответ №3:

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

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

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

 for domain in list1:
    len(df[df['Email_Address'] == domain])  # Save this value whatever you want