#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