[英]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_dict
的df_1
的鍵中,則分配與從該字典中看到的相同的值。 如果該字典中不存在rank_1
URL,則為其分配值 0。rank_2
和rank_3
執行相同的操作,最后會為df_2
中的每一行生成一個字典。 例如,由於df_1
和df_2
中的第 1 行共享相同的id
(2223),並且rank_1
( www.yahoo.com ) 是rank_dict
中df_2
中的df_1
,並且該 Key 的值為 2,則分配值為 2到www.yahoo.com密鑰。 rank_2
( www.whatever.com ) 在rank_dict
的df_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
基於公共id
從df1
到df2
的列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
cols
和dcts
,然后在列表解析中迭代此 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.