如何将 DF groupby 对象过滤到列表中

how to filter a DF groupby object to a list

我正在过滤数据帧并使用 smtplib 在电子邮件中发送信息结果。 这是我到目前为止得到的。

def SMTP_Emailer(content, receiver):
    msg = EmailMessage()
    msg['Subject'] = "Test Email!"
    msg['From'] = 'test@example.com'
    msg['To'] = [receiver]

    msg.set_content( f""" This is a test email, please disregard{content}
        """,  subtype='html')


    with smtplib.SMTP('sendsmtp.server.com', 1234) as s:
                s.send_message(msg)

我有一个这样的 pandas 数据框:

d = 
  STATE   CUSTOMER      ORDERS     EMAIL OWNER
0    ID   Jerry         10        Jerry@example.com  
1    MT   Tom           119       Jerry@example.com
2    CA   Patrick       87        Jerry@example.com
3    WA    Lucy         918       Mark@example.com

然后我按系列 d['EMAIL OWNER']

分组
grouped = df.groupby("EMAIL TEST")
    for emails, data  in grouped:
        print(emails)
        dataframes = [emails for e, group in grouped]
        print(dataframes)
        SMTP_Emailer(data.loc[:, :].to_html(), dataframes)

我期待 ['Jerry@example.com ', 'Mark@example.com '] 以便我可以将它们放入我的消息中['To']

但我意外地在 VS Code

中得到 ['Mark@example.com ','Mark@example.com ']

在 jupyter notebook 中我得到:

Mark@example.com
['Mark@example.com', 'Mark@example.com']
Jerry@example.com
['Jerry@example.com', 'Jerry@example.com']

结果是 2 封单独的电子邮件。我使用 groupby 按个人电子邮件地址从主要数据源 (d) 进行过滤,这样他们只能看到他们拥有的东西,而看不到其他人拥有的东西。所以 Mark 不会看到 Jerry 的数据(反之亦然)

如果这有助于澄清事情,请告诉我。

#Email 1  gets sent to Jerry@example.com

Email 1 = 
 
  STATE   CUSTOMER      ORDERS     EMAIL OWNER
0    ID   Jerry         10        Jerry@example.com  
1    MT   Tom           119       Jerry@example.com
2    CA   Patrick       87        Jerry@example.com

#Email 2  gets sent to Mark@example.com

Email 2 =

3   WA    Lucy         918       Mark@example.com

所以groupby是个错误。编写这样的代码然后为我想要的用户过滤数据框要容易得多。我意识到我正在复制已经存在的数据框。这是最终代码:

    for email in df['EMAIL OWNER'].unique().tolist():
        dfuser = df.loc[df[' EMAIL OWNER'] == email]

        SMTP_Emailer(dfuser.to_html(), email)

很高兴您解决了问题!如果您仍然感兴趣,我只是想展示如何使用 groupby。在你的回答中,你几乎做了一个 groupby (!):

for email,dfuser in df.groupby('EMAIL OWNER'):
    SMTP_Emailer(dfuser.to_html(), email)