簡體   English   中英

Pandas 根據另一列的條件創建字典列

[英]Pandas create column of dictionaries based on condition from another column

假設我有一個名為df_1的 Pandas df,如下所示:

ID 創建日期 rank_1 rank_2 rank_3 rank_dict
2223 21 年 3 月 3 日 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 21 年 4 月 9 日 5:15 www.yahoo.com www.whatever.com www.google.com
1112 21 年 8 月 20 日 2:30 www.gm.com www.motor1.com www.webull.com

我想在df_2中創建一個名為new_rank_dict的新列,使用 df_2 中的 rank_1、rank_2、rank_3 中的df_2作為鍵,並使用以下標准創建的值:

  • df_1中查找具有匹配id的行,如果 rank_1 URL 存在於該行的rank_dictdf_1的鍵中,則分配與從該字典中看到的相同的值。 如果該字典中不存在rank_1 URL,則為其分配值 0。
  • rank_2rank_3執行相同的操作,最后會為df_2中的每一行生成一個字典。

例如,由於df_1df_2中的第 1 行共享相同的id (2223),並且rank_1 ( www.yahoo.com ) 是rank_dictdf_2中的df_1 ,並且該 Key 的值為 2,則分配值為 2到www.yahoo.com密鑰。 rank_2 ( www.whatever.com ) 在rank_dictdf_1中不存在,因此它的值為 0。 rank_3 ( www.google.com ) 確實存在於rank_dict中的df_1中,其值為 3,到新字典的那個鍵。 最后, df_2中的第 1 行將具有new_rank_dict{www.yahoo.com:2, www.whatever.com:0, www.google.com:3}

所以理想的結果df_2應該是這樣的:

ID 創建日期 rank_1 rank_2 rank_3 rank_dict
2223 21 年 4 月 9 日 5:15 www.yahoo.com www.whatever.com www.google.com {www.yahoo.com:2, www.whatever.com:0 , www.google.com:3}
1112 21 年 8 月 20 日 2:30 www.gm.com www.motor1.com www.webull.com {www.gm.com:0, www.motor1.com:2 , www.webull.com:1}

我一直在努力尋找一種 Pythonic 方法來有效地實現這一目標 - 在 web 上進行了搜索,大多數教程都指向從 Pandas 列創建單個字典,而不是我在這里需要的字典列。

任何建議將不勝感激!

代碼

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基於公共iddf1df2的列rank_dict

>>> 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

現在過濾df2中的列等rank

>>> 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 colsdcts ,然后在列表解析中迭代此 zip 迭代器以創建滿足給定條件的所需字典。

>>> df2

     id  date_created         rank_1            rank_2          rank_3                                                         rank_dict
0  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}
1  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}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM