【问题标题】:Pandas Dataframe from nested dictionary of pandas dataframes来自熊猫数据框嵌套字典的熊猫数据框
【发布时间】:2021-02-15 22:52:57
【问题描述】:

我有一个包含 2 级键的字典,第二级的值是数据框:

my_dict = {
           'elem1':{'day1': pd.DataFrame(columns=['Col1', 'Col2']),
                    'day2': pd.DataFrame(columns=['Col1', 'Col2'])
                   },
           'elem2':{'day1': pd.DataFrame(columns=['Col1', 'Col2']),
                    'day2': pd.DataFrame(columns=['Col1', 'Col2'])
                    'day3': pd.DataFrame(columns=['Col1', 'Col2'])
                   }
          }

如何将其转换为以下形式的多索引 pandas 数据框:

                 Col1    Col2
elem1    day1    ...      ...
         day2    ...      ...
elem2    day1    ...      ...
         day2    ...      ...

我已经查看了这些答案,但无法拼凑出一个解决方案:

【问题讨论】:

    标签: python pandas dataframe dictionary nested


    【解决方案1】:

    想法是通过两个键创建元组并传递给concatMultiIndex 的第三级是从原始DataFrames 的索引值创建的,如果需要,您可以将其删除:

    my_dict = {
               'elem1':{'day1': pd.DataFrame(1, columns=['Col1', 'Col2'], index=[1,2]),
                        'day2': pd.DataFrame(2, columns=['Col1', 'Col2'], index=[1,2])
                       },
               'elem2':{'day1': pd.DataFrame(3, columns=['Col1', 'Col2'], index=[1,2]),
                        'day2': pd.DataFrame(4, columns=['Col1', 'Col2'], index=[1,2]),
                        'day3': pd.DataFrame(5, columns=['Col1', 'Col2'], index=[1,2])
                       }
              }
    

    d = {(k1, k2): v2 for k1, v1 in my_dict.items() for k2, v2 in v1.items()}
    print (d)
    {('elem1', 'day1'):    Col1  Col2
    1     1     1
    2     1     1, ('elem1', 'day2'):    Col1  Col2
    1     2     2
    2     2     2, ('elem2', 'day1'):    Col1  Col2
    1     3     3
    2     3     3, ('elem2', 'day2'):    Col1  Col2
    1     4     4
    2     4     4, ('elem2', 'day3'):    Col1  Col2
    1     5     5
    2     5     5}
    
    df = pd.concat(d, sort=False)
    print (df)
                  Col1  Col2
    elem1 day1 1     1     1
               2     1     1
          day2 1     2     2
               2     2     2
    elem2 day1 1     3     3
               2     3     3
          day2 1     4     4
               2     4     4
          day3 1     5     5
               2     5     5
    

    df = pd.concat(d, sort=False).reset_index(level=2, drop=True)
    print (df)
                Col1  Col2
    elem1 day1     1     1
          day1     1     1
          day2     2     2
          day2     2     2
    elem2 day1     3     3
          day1     3     3
          day2     4     4
          day2     4     4
          day3     5     5
          day3     5     5
    

    【讨论】:

    • 很好的答案,我只需要修改以下行:df = pd.concat(d, sort=False),因为我想要一个特定的专栏预先
    【解决方案2】:

    试试这样:

    my_dict = {
               'elem1':{'day1': pd.DataFrame(columns=['Col1', 'Col2']),
                        'day2': pd.DataFrame(columns=['Col1', 'Col2'])
                       },
               'elem2':{'day1': pd.DataFrame(columns=['Col1', 'Col2']),
                        'day2': pd.DataFrame(columns=['Col1', 'Col2'])
                        'day3': pd.DataFrame(columns=['Col1', 'Col2'])
                       }
              }
    nd = {}
    for x in my_dict:
      nd.update(my_dict[x])
    df = pd.DataFrame(nd,index=my_dict.keys())
    

    【讨论】:

      猜你喜欢
      • 2016-11-13
      • 2023-03-23
      • 2018-04-14
      • 2019-03-02
      • 1970-01-01
      • 2019-01-11
      • 1970-01-01
      相关资源
      最近更新 更多