【问题标题】:How to create dataframe and set index with dictionary of dictionaries?如何使用字典创建数据框并设置索引?
【发布时间】:2021-09-19 02:06:04
【问题描述】:

我想创建一个数据框,其列作为星期几,每个人的姓名和相应的开始/结束时间。到目前为止,我可以将数据从字典中获取到 Dataframe,但我正在努力使索引正确。我设法从这个问题Python - how to load nested dictionary into Pandas dataframe? 中获得了一些帮助,但我不确定如何重新排列索引以实现我所需要的。

我知道我需要 .drop Times 专栏,但在那之后我就没有想法了。我想以某种方式将row[0] 设置为索引,但我不确定这是否是最好的方法。

这是我目前所做的工作:

数据:

employees = {"Mon":{
                "Name":{"0":"John","1":"Nick","2":"Ali","3":"Joseph"},
                "Start":{"0":"9a","1":"9a","2":"3p","3":"3p"},
                "End":{"0":"5p","1":"5p","2":"11p","3":"11p"},
            },
            "Tues":{
                "Name":{"0":"John","1":"Nick","2":"Ali","3":"Joseph"},
                "Start":{"0":"9a","1":"9a","2":"3p","3":"3p"},
                "End":{"0":"5p","1":"5p","2":"11p","3":"11p"},
        }
}

创建数据框的代码:

dict_df = pd.DataFrame.from_dict({(i,j): employees[i][j]
                                      for i in employees.keys()
                                      for j in employees[i].keys()}, orient='index').reset_index().rename(
{'level_0': 'Day', 'level_1': 'Name'}, axis=1)

当前输出:

    Day   Name     0     1    2       3
0   Mon   Name  John  Nick  Ali  Joseph
1   Mon  Start    9a    9a   3p      3p
2   Mon    End    5p    5p  11p     11p
3  Tues   Name  John  Nick  Ali  Joseph
4  Tues  Start    9a    9a   3p      3p
5  Tues    End    5p    5p  11p     11p

需要的输出:

   Days  Times  John  Nick  Ali  Joseph
0   Mon  Start    9a    9a   3p      3p
1   Mon    End    5p    5p  11p     11p
2  Tues  Start    9a    9a   3p      3p
3  Tues    End    5p    5p  11p     11p

【问题讨论】:

    标签: python pandas dataframe dictionary nested


    【解决方案1】:

    没有与set_index 等效的列,因此您可以从每个子字典创建一个DataFrame,然后最后将它们Transpose 和concat 放在一起。然后,您可以将键分配为日期值。

    最后,如果您想要一个 MultiIndex,只需 .set_index(['Days', 'Times'])

    import pandas as pd
    
    df = pd.concat([(pd.DataFrame(d).set_index('Name').T
                       .rename_axis(index='Times', columns=None)
                       .reset_index()
                       .assign(Days=day))
                    for day,d in employees.items()], ignore_index=True)
    

    print(df)
    
       Times John Nick  Ali Joseph  Days
    0  Start   9a   9a   3p     3p   Mon
    1    End   5p   5p  11p    11p   Mon
    2  Start   9a   9a   3p     3p  Tues
    3    End   5p   5p  11p    11p  Tues
    

    【讨论】:

    • 这太棒了!谢谢!
    猜你喜欢
    • 2021-11-24
    • 2019-09-28
    • 2017-05-03
    • 1970-01-01
    • 2017-04-30
    • 1970-01-01
    • 2020-05-10
    • 1970-01-01
    • 2019-05-27
    相关资源
    最近更新 更多