【问题标题】:How to create a nested dictionary from a dataframe如何从数据框创建嵌套字典
【发布时间】:2022-06-13 23:56:06
【问题描述】:

我有一个这样的数据框:

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

【问题讨论】:

  • 输入和输出都不是有效的python,请确保可以在python shell中定义对象吗?

标签: python pandas dataframe dictionary


【解决方案1】:

试试这个:

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

输出:

{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()

输出:

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

【讨论】:

    【解决方案2】:

    假设这个输入:

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

    输出:

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

    或数据透视表:

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

    输出:

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

    【讨论】:

      猜你喜欢
      • 2021-11-16
      • 2022-01-13
      • 1970-01-01
      • 2022-06-13
      • 1970-01-01
      • 2022-09-27
      • 1970-01-01
      相关资源
      最近更新 更多