熊猫根据另一列的条件创建字典列

时间:2021-03-13 17:32:20

标签: python pandas dataframe dictionary

假设我有一个名为 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_dictdf_1 的 Keys 中存在 rank_1 URL,则分配相同的 Value正如从那本字典中看到的那样。如果该字典中不存在 rank_1 网址,则为其分配值 0。
  • rank_2rank_3 执行相同的操作,最终会得到 df_2 中每一行的字典。

例如,由于 df_1df_2 中的第 1 行共享相同的 id (2223) 和 rank_1 (www.yahoo.com) }} 是 df_2rank_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_2new_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>

任何建议将不胜感激!

1 个答案:

答案 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)]

说明

maprank_dictdf1df2 基于共同的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 zipcols,然后在列表推导式中遍历此 zip 迭代器以创建满足给定条件的必需字典。

dcts