【问题标题】:Check if value is present in dataframe and find it within a dictionary检查数据框中是否存在值并在字典中找到它
【发布时间】:2018-07-19 12:18:31
【问题描述】:

假设一个数据框

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

【问题讨论】:

    标签: python pandas email dictionary


    【解决方案1】:

    使用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 列,可以将groupbymap 步骤组合在一起,并简化您的解决方案:

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

    【讨论】:

    • 这很完美!有什么方法可以保留他们的名字,以便我可以将它们放在电子邮件中?
    • @ATCH_torn 当然!事实上,它甚至更简单。我已经编辑了我的答案。
    • 效果很好!最后一个问题。然后我可以取名字并将其附加到字典中吗?理想情况下,我希望一举拥有name: email, df
    • @ATCH_torn 好吧,你可以这样做。键是名称,值是列表/元组。您可以选择通过迭代df_dict 来创建一个新的字典。对于每个值,df.Team.unique() 都会为您提供名称。祝你好运!
    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-01
      • 2012-01-03
      • 2019-02-13
      相关资源
      最近更新 更多