检查数据框中是否存在某个值,并在字典中找到它。

3
假设有一个数据框:
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发送一封空数据框的电子邮件。我该如何轻松地遍历并仅获取字典中存在的名称,然后利用字典的电子邮件值发送电子邮件?
2个回答

4
使用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

请注意,mapreplace更具可扩展性。之后,您可以迭代每个键值对并进行调度:
for email, df in df_dict.items():
    data = df.to_html()
    ... # dispatch `data` to `email`

如需了解如何使用SMTP协议通过Python发送电子邮件的更多信息,请参阅标准库中的email模块。


如果您想保留Name列,可以将groupbymap步骤合并在一起,简化您的解决方案:

df_dict = {i : g for i, g in df.groupby(df.Team.map(Team))}

这个完美运行!有没有办法保留它们的名称,以便我可以将它们放在电子邮件中? - AGH_TORN
1
@ATCH_torn 当然可以!实际上,它更简单了。我已经编辑了我的答案。 - cs95
太好了!最后一个问题。我能把名字附加到字典中吗?理想情况下,我希望name: email, df一次性完成。 - AGH_TORN
1
@ATCH_torn 好的,你可以这样做。关键字是名称,值是列表/元组。您可以选择通过迭代df_dict来创建新的字典。对于每个值,df.Team.unique()会给出名称。祝你好运! - cs95

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接