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

Posted

技术标签:

【中文标题】如何将 DF groupby 对象过滤到列表中【英文标题】:how to filter a DF groupby object to a list 【发布时间】:2022-01-10 06:36:48 【问题描述】:

我正在过滤数据框并使用 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 disregardcontent
        """,  subtype='html')


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

我有一个这样的熊猫数据框:

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'] 以便我可以将它们放入我的 msg['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

【问题讨论】:

我不明白你想要dataframes 是什么。您想向每个电子邮件地址发送多少封电子邮件?修复是否只是 SMTP_Emailer(data.loc[:, :].to_html(), emails),因为 func 的第二个参数应该是电子邮件地址? 我希望数据帧在 df['Email TEST'] 中创建一个电子邮件列表,因为我认为我只收到 1 封电子邮件返回 SMTP_Emailer(data.loc[:, :].to_html() , 电子邮件)而不是两者。 告诉我们你想要什么 感谢您的澄清,但我还是有点困惑。您要向每个地址发送多少封电子邮件? 你能澄清一下预期的输出吗?为什么首先需要 groupby? 【参考方案1】:

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

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

【讨论】:

这也有道理!谢谢你发帖【参考方案2】:

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

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

        SMTP_Emailer(dfuser.to_html(), email)

【讨论】:

以上是关于如何将 DF groupby 对象过滤到列表中的主要内容,如果未能解决你的问题,请参考以下文章

Pandas groupby 对象过滤

Pandas groupby,过滤并将输出放入列表中

如何在 pandas 中使用过滤条件和 groupby

如何有效地过滤由两列groupby操作获得的数据帧,以仅包含第二个索引的最大值和最小值?

如何将 dplyr 过滤器应用于数据框列表?

如何访问python groupby对象值