假设我有一个名为 df_1
的 Pandas df,如下所示:
id | 创建日期 | rank_1 | rank_2 | rank_3 | rank_dict |
---|---|---|---|---|---|
2223 | 3/3/21 3:26 | www.google.com | www.yahoo.com | www.ford.com | {www.google.com:3, www.yahoo.com:2, www.ford.com:1} |
1112 | 2/25/21 1:35 | www.autoblog.com | www.motor1.com | www.webull.com | {www.autoblog.com:3, www.motor1.com:2, www.webull.com:1} |
和另一个名为 df_2
的 df,如下所示:
id | 创建日期 | rank_1 | rank_2 | rank_3 |
---|---|---|---|---|
2223 | 4/9/21 5:15 | www.yahoo.com | www.whatever.com | www.google.com |
1112 | 8/20/21 2:30 | www.gm.com | www.motor1.com | www.webull.com |
我想在 new_rank_dict
中创建一个名为 df_2
的新列,使用 df_2
中的 rank_1、rank_2、rank_3 中的 URL 作为键,以及使用以下条件创建的值:
df_1
中查找匹配 id
的行,如果该行的 rank_dict
的 df_1
的 Keys 中存在 rank_1 URL,则分配相同的 Value正如从那本字典中看到的那样。如果该字典中不存在 rank_1
网址,则为其分配值 0。rank_2
和 rank_3
执行相同的操作,最终会得到 df_2
中每一行的字典。例如,由于 df_1
和 df_2
中的第 1 行共享相同的 id
(2223) 和 rank_1
(www.yahoo.com) }} 是 df_2
中 rank_dict
中的 Key,该 Key 的值为 2,然后将 Value 2 分配给 www.yahoo.com Key。 df_1
(www.whatever.com) 在 rank_2
中的 rank_dict
中不存在,因此它的值为 0。df_1
(www.google.com) 存在存在于 rank_3
中的 rank_dict
中,其值是 3,因此将值 3 分配给新字典的该键。最后,df_1
中的第 1 行将包含 df_2
:new_rank_dict
所以理想的结果 {www.yahoo.com:2, www.whatever.com:0, www.google.com:3}
应该是这样的:
id | 创建日期 | rank_1 | rank_2 | rank_3 | rank_dict |
---|---|---|---|---|---|
2223 | 4/9/21 5:15 | www.yahoo.com | www.whatever.com | www.google.com | {www.yahoo.com:2, www.whatever.com:0, www.google.com:3} |
1112 | 8/20/21 2:30 | www.gm.com | www.motor1.com | www.webull.com | {www.gm.com:0, www.motor1.com:2, www.webull.com:1} |
我一直在努力寻找一种 Pythonic 的方式来有效地实现这一目标 - 在网上搜索过,大多数教程都指向从 Pandas 列创建单个字典,而不是我在这里需要的字典列。< /p>
任何建议将不胜感激!
答案 0 :(得分:3)
dcts = df2['id'].map(df1.set_index('id')['rank_dict'])
cols = df2.filter(like='rank')
df2['rank_dict'] = [{u: dct.get(u, 0) for u in urls}
for urls, dct in zip(cols.values, dcts)]
map
列rank_dict
从df1
到df2
基于共同的id
>>> dcts
0 {'www.google.com': 3, 'www.yahoo.com': 2, 'www.ford.com': 1}
1 {'www.autoblog.com': 3, 'www.motor1.com': 2, 'www.webull.com': 1}
Name: id, dtype: object
现在过滤来自rank
的{{1}}列:
df2
>>> cols
rank_1 rank_2 rank_3
0 www.yahoo.com www.whatever.com www.google.com
1 www.gm.com www.motor1.com www.webull.com
zip
和 cols
,然后在列表推导式中遍历此 zip 迭代器以创建满足给定条件的必需字典。
dcts