簡體   English   中英

如何從 dataframe 創建嵌套字典

[英]How to create a nested dictionary from a dataframe

我有一個這樣的 dataframe:

df = pd.DataFrame(id:{1,2,1,4,4},
course:{math,math,sci,art,math},
result:{pass,pass,fail,fail,fail}}

我想創建一個這樣的嵌套字典:對於每個 ID,我想制作一個包含已通過課程和未通過課程的嵌套字典。

{id:{pass:{courses},fail:{courses}}}

{1:{pass:{math},fail:{sci}},2:{pass:{math}},4:{fail:{art,math}}}

嘗試這個:

df = pd.DataFrame({'id':[1,2,1,4,4],
'course':['math','math','sci','art','math'],
'result':['pass','pass','fail','fail','fail']})


df.groupby(['result', 'id'])['course'].agg(list).unstack().to_dict()

Output:

{1: {'fail': ['sci'], 'pass': ['math']},
 2: {'fail': nan, 'pass': ['math']},
 4: {'fail': ['art', 'math'], 'pass': nan}}

好吧,是的,在@mozway 解決方案中達到頂峰,使用set而不是list

df.groupby(['result', 'id'])['course'].agg(set).unstack().to_dict()

Output:

{1: {'fail': {'sci'}, 'pass': {'math'}},
 2: {'fail': nan, 'pass': {'math'}},
 4: {'fail': {'art', 'math'}, 'pass': nan}}

假設這個輸入:

   id course result
0   1   math   pass
1   2   math   pass
2   1    sci   fail
3   4    art   fail
4   4   math   fail

您可以使用嵌套的 groupby:

out = (df.groupby('id')
         .apply(lambda g: g.groupby('result')['course']
                           .agg(set).to_dict())
         .to_dict()
       )

output:

{1: {'fail': {'sci'}, 'pass': {'math'}},
 2: {'pass': {'math'}},
 4: {'fail': {'art', 'math'}}}

或者 pivot 表:

(df.pivot_table(columns='id', index='result', values='course', aggfunc=set)
   .to_dict()
)

output:

{1: {'fail': {'sci'}, 'pass': {'math'}},
 2: {'fail': nan, 'pass': {'math'}},
 4: {'fail': {'art', 'math'}, 'pass': nan}}

暫無
暫無

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

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