从 Pandas 高效创建字典的 Pythonic 方法

Pythonic way to efficient create dictionaries from Pandas

我有一个 Pandas 数据框,其中包含列 iddate_createdrank_1rank_2rank_3。下面显示了 2 行数据框。

id date_created rank_1 rank_2 rank_3
2223 3/3/21 3:26 www.google.com www.yahoo.com www.ford.com
1112 2/25/21 1:35 www.autoblog.com www.motor1.com www.webull.com

我正在尝试为此 df 分配一个新列并将其命名为 rank_dict,这会将编号 3 分配给 rank_1 URL,编号 2 分配给 rank_2 ] URL 和数字 1 到 rank_3 URL。 所以理想的结果应该是这样的:

id date_created 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}

如果不是 Pandas df,我知道该怎么做。例如,如果我有这些键值列表:

keys = ['www.google.com','www.yahoo.com','www.ford.com']

values = [3, 2, 1]

我可以res_dict = dict(zip(keys, values))把它变成字典:{'www.google.com': 3, 'www.yahoo.com': 2, 'www.ford.com': 1}

但是我想不出一种优雅的方式来在 Pandas df 中创建这个字典。谁能帮帮我?

一种方法是 apply 并使用 enumerate 来获取枚举:

df['rank_dict'] = (df.filter(like='rank_')
                     .apply(lambda x: {v:3-k for k,v in enumerate(x)}, axis=1)
                  )

输出:

     id   date_created             rank_1           rank_2          rank_3                                          rank_dict
0  2223   3/3/21 3:26     www.google.com    www.yahoo.com     www.ford.com  {'www.google.com': 3, 'www.yahoo.com': 2, 'w...'
1  1112  2/25/21 1:35   www.autoblog.com   www.motor1.com   www.webull.com  {'www.autoblog.com': 3, 'www.motor1.com': 2,...'