假设数据帧
Market | Status | Team |
-------|--------|------|
Chicago| 1 | Tom |
Chicago| 1 | Tom |
SF Bay | 3 | Julia|
SF Bay | 1 | Julia|
SF Bay | 1 | Julia|
和一本字典
Team = {"Tom": "tom@email.com", "Julia": "Julia@email.com", "Carol": "carol@email.com"}
我想让每个团队成员获得特定的数据框,将其转换为HTML并通过电子邮件发送给他们。我可以单独获取所需的数据帧,然后df.to_html()
。在上面的例子中,Carol
在字典中,但不在数据框内,所以我不希望她收到电子邮件。
我试过
for i in Team:
df[df['Team'].str.contains(i)]
Mail = df[df['Team'].isin([i])]
...
#send an email
但是,这会向Carol
发送一封空白数据框的电子邮件。如何轻松地迭代并获取我的字典中存在的名称,然后利用字典电子邮件值发送电子邮件?
答案 0 :(得分:3)
使用map
,将Team
列转换为一列电子邮件地址,然后使用groupby
分别获取每个团队成员DataFrame
,使用词典理解。
df['Team'] = df['Team'].map(Team)
df
Market Status Team
0 Chicago 1 tom@email.com
1 Chicago 1 tom@email.com
2 SF Bay 3 Julia@email.com
3 SF Bay 1 Julia@email.com
4 SF Bay 1 Julia@email.com
df_dict = {i : g for i, g in df.groupby('Team')}
df_dict.keys()
dict_keys(['Julia@email.com', 'tom@email.com']) # look ma, no Carol
请注意map
scales better than replace
。在此之后,您可以迭代每个键值对,然后发送:
for email, df in df_dict.items():
data = df.to_html()
... # dispatch `data` to `email`
有关如何使用SMTP协议通过python发送电子邮件的更多信息,请参阅标准库中的email
模块。
如果您想保留Name
列,可以将groupby
和map
步骤合并在一起,并简化您的解决方案:
df_dict = {i : g for i, g in df.groupby(df.Team.map(Team))}
答案 1 :(得分:2)
使用replace
:-)
df.Team.replace(d,inplace=True)
df
Out[176]:
Market Status Team
0 Chicago 1 tom@email.com
1 Chicago 1 tom@email.com
2 SFBay 3 Julia@email.com
3 SFBay 1 Julia@email.com
4 SFBay 1 Julia@email.com