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

时间:2018-02-08 19:58:07

标签: 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发送一封空白数据框的电子邮件。如何轻松地迭代并获取我的字典中存在的名称,然后利用字典电子邮件值发送电子邮件?

2 个答案:

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

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