如何将 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)
我正在过滤数据帧并使用 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)