python - 检查值是否存在于数据框中并在字典中找到它

标签 python pandas email dictionary

假设一个数据框

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 发送一封包含空白数据框的电子邮件。我如何才能轻松地遍历并仅获取字典中存在的那些名称,然后利用字典电子邮件值发送电子邮件?

最佳答案

使用 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 .在此之后,您可以遍历每个键值对,并分派(dispatch):

for email, df in df_dict.items():
    data = df.to_html()
    ... # dispatch `data` to `email`

有关如何使用 SMTP 协议(protocol)通过 python 发送电子邮件的更多信息,请参阅 email标准库中的模块。


如果你想保留 Name 列,你可以将 groupbymap 这一步结合起来,简化你的解决方案:

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

关于python - 检查值是否存在于数据框中并在字典中找到它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48693785/

相关文章:

iOS:如何模仿 'to' 字段?

Spring Integration - 未考虑邮件入站 channel 适配器的延迟轮询器

python - 使用正则表达式 python 提取文本 block

python - 如何将连接列表作为参数传递?

python - GAE Python - PyCrypto - 没有名为 winrandom 的模块

python - 我如何使用 pandas 在 Excel 工作表的某些单元格上写注释

python - 如何更改 wxPython 工具栏的外观?

python - Pandas 将字典嵌套到数据框

python - 如何构建可以处理非数字目标的用户友好的 sklearn 回归器?

java - 在 Spring Boot 中发送带附件的电子邮件