如何将 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 对象过滤到列表中的主要内容,如果未能解决你的问题,请参考以下文章