Значение рассчитывает для определенных элементов в DataFrame - PullRequest
0 голосов
/ 30 мая 2018

У меня есть датафрейм (df) сообщений, который выглядит примерно так:

From                To
person1@gmail.com   stranger1@gmail.com
person2@gmail.com   stranger1@gmail.com, stranger2@gmail.com
person3@gmail.com   person1@gmail.com, stranger2@gmail.com

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

lst = ['person1@gmail.com', 'stranger2@gmail.com', 'person3@gmail.com']

Я надеюсь получить фрейм данных / серию / словарь с таким результатом:

list_item              Total_Count
person1@gmail.com      2
stranger2@gmail.com    2
person3@gmail.com      1

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

for To,From in zip(df.To, df.From): 
    for item in lst:
        if To,From contains item in emails:
            Count(item)

Если этот тип задачи будет выполнен с помощью forцикл или есть какие-то из методов панды, которые могли бы решить эту проблему проще?

1 Ответ

0 голосов
/ 30 мая 2018

stack на основе

Разделите ваш столбец To, stack все и затем выполните value_counts:

v = pd.concat([df.From, df.To.str.split(', ', expand=True)], axis=1).stack()
v[v.isin(lst)].value_counts()

stranger2@gmail.com    2
person1@gmail.com      2
person3@gmail.com      1
dtype: int64

melt

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

v = (df.set_index('From')
      .To.str.split(', ', expand=True)
      .reset_index()
      .melt()['value']
)
v[v.isin(lst)].value_counts()

stranger2@gmail.com    2
person1@gmail.com      2
person3@gmail.com      1
Name: value, dtype: int64

Обратите внимание, что set_index + str.split + reset_index является синонимом pd.concat([...]) ...

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