Циклически перебирайте фрейм данных pandas, вставляйте получателя и фрейм данных в электронную почту Outlook - PullRequest
0 голосов
/ 04 апреля 2019

Как мне пройти по циклу данных pandas на основе уникальных значений в столбце и вставить в отдельную электронную почту Outlook?

Вот мой код:

def Emailer(subject, recipient):
    import win32com.client as win32   
    outlook = win32.Dispatch('outlook.application')
    mail = outlook.CreateItem(0)
    mail.To = recipient
    mail.Subject = subject
    mail.HtmlBody =  """Lots of text"""
    attachment = 'C:/Users/Documents/file.pdf'
    mail.Attachments.Add(attachment)
    mail.Display(True)

Emailer('subject', "multiple e-mails")

Вот мойфрейм данных, который я хочу просмотреть и вставить в каждое отдельное электронное письмо.

df = pd.DataFrame(np.random.randn(10, 2), columns=list('AB'))
df['Email'] = np.random.choice(['john@mail.com', 'mark@mail.com', 'tina@mail.com'], 10)

          A         B          Email
0 -0.740284  0.509764  mark@mail.com
1  0.119413 -1.270088  mark@mail.com
2  1.792915 -0.243748  mark@mail.com
3  0.181352 -1.949043  tina@mail.com
4 -0.172640  0.051009  john@mail.com
5  0.627760 -0.038189  tina@mail.com
6 -0.589791 -3.255643  tina@mail.com
7  1.654046  0.855315  tina@mail.com
8  2.213134 -0.266334  mark@mail.com
9 -0.907995  0.880413  mark@mail.com

Скажем, для Тины ее почта будет такой.Цикл извлекает строки из df['Email'] и вставляет фрейм данных в mail.HtmlBody, а значение из Email в mail.To = recipient.Кроме того, я хочу, чтобы у Марка и Джона были электронные письма с похожей структурой.Тема будет одинаковой для каждого электронного письма.Только «Кому» и «Тело» будет отличаться в зависимости от электронной почты.

To: tina@mail.com
Subject: subject
Body:

Lots of text

          A         B          Email
3  0.181352 -1.949043  tina@mail.com
5  0.627760 -0.038189  tina@mail.com
6 -0.589791 -3.255643  tina@mail.com
7  1.654046  0.855315  tina@mail.com

Редактировать: Я создал цикл for, который разбил информационный кадр на уникальные таблицы:

for email, df_email in df.groupby('Email'):
    print(df_email)

          A         B          Email
 4 -0.17264  0.051009  john@mail.com
          A         B          Email
0 -0.740284  0.509764  mark@mail.com
1  0.119413 -1.270088  mark@mail.com
2  1.792915 -0.243748  mark@mail.com
8  2.213134 -0.266334  mark@mail.com
9 -0.907995  0.880413  mark@mail.com
          A         B          Email
3  0.181352 -1.949043  tina@mail.com
5  0.627760 -0.038189  tina@mail.com
6 -0.589791 -3.255643  tina@mail.com
7  1.654046  0.855315  tina@mail.com

1 Ответ

1 голос
/ 04 апреля 2019

Я думаю, вы ищете pandas dataframe.to_string для создания читаемой строки из вашего кадра данных.Затем вы можете сделать что-то вроде:

for i in df['Email'].unique():
    create_mail(i)

(create_mail - это любая функция, создающая вашу электронную почту в Outlook).В этой ситуации вам необходимо добавить

df[df['Email'] == i].to_string()

к mail.HtmlBody.

В другой заметке df.to_html также стоит попробовать.

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