嵌套字典到熊猫 df

Posted

技术标签:

【中文标题】嵌套字典到熊猫 df【英文标题】:Nested dictionary to pandas df 【发布时间】:2019-03-12 16:21:09 【问题描述】:

我在***中的第一个问题!

我有一个三重嵌套字典,我想将其转换为 pandas df。 字典结构如下:

dictionary = 'CompanyA': 'Revenue': date1 : $1, date2: $2,... 
                          'ProfitLoss': date1 : $0, date2: $1,
              'CompanyB': 'Revenue': date1 : $1, date2: $2,... 
                          'ProfitLoss': date1 : $0, date2: $1,
              'CompanyC': 'Revenue': date1 : $1, date2: $2,...
                          'ProfitLoss': date1 : $0, date2: $1

到目前为止,我能够使用以下方法构造一个 df:

df = pd.DataFrame.from_dict(dictionary)

但结果是一个 df,其值为字典,如下所示:

          CompanyA          CompanyB          CompanyC
Revenue   date1:$0,..     date1:$1,..     date1:$0,.. 
ProfitLossdate1:$0,..     date1:$0,..     date1:$0,..

我希望表格如下所示:

                    CompanyA    CompanyB    CompanyC  
Revenue    Date1       $1          $1          $1 
           Date2       $2          $2          $2

ProfitLoss Date1       $0          $0          $0
           Date2       $1          $1          $1

我曾尝试使用 pd.MultiIndex.from_dict (.from_product) 并更改索引,但没有结果。知道下一步该怎么做吗?任何提示将不胜感激!

【问题讨论】:

Construct pandas DataFrame from items in nested dictionary的可能重复 【参考方案1】:

我知道您是新手,但可能会有类似问题的答案,请参阅this。下次尝试使用关键字寻找类似的问题。比如我通过搜索“pandas nested dict”找到了我链接的那个,就是这样,第一个链接是SO帖子!

无论如何,您需要重塑您的输入dict。你想要一个结构如下的字典:


    'CompanyA': 
        ('Revenue', 'date1'): 1,
        ('ProfitLoss', 'date1'): 0,
    
    ...

我会这样做:

import pandas as pd

data = 
    'CompanyA': 
        'Revenue': 
            "date1": 1,
            "date2": 2
        ,
        'ProfitLoss': 
            "date1": 0,
            "date2": 1
        
    ,
    'CompanyB': 
        'Revenue': 
            "date1": 4,
            "date2": 5
        ,
        'ProfitLoss': 
            "date1": 2,
            "date2": 3
        
    


# Reshape your data and pass it to `DataFrame.from_dict`
df = pd.DataFrame.from_dict(i: (j, k): data[i][j][k]
                                    for j in data[i] for k in data[i][j]
                                for i in data, orient="columns")

print(df)

输出:

                  CompanyA  CompanyB
ProfitLoss date1         0         2
           date2         1         3
Revenue    date1         1         4
           date2         2         5

编辑

使用实际日期时间来回复您的评论:

import pandas as pd
import datetime as dt

date1 = dt.datetime.now()
date2 = date1 + dt.timedelta(days=365)

data = 
    'CompanyA': 
        'Revenue': 
            date1: 1,
            date2: 2
        ,
        'ProfitLoss': 
            date1: 0,
            date2: 1
        
    ,
    'CompanyB': 
        'Revenue': 
            date1: 4,
            date2: 5
        ,
        'ProfitLoss': 
            date1: 2,
            date2: 3
        
    


# Reshape your data and pass it to `DataFrame.from_dict`
df = pd.DataFrame.from_dict(i: (j, k): data[i][j][k]
                                    for j in data[i] for k in data[i][j]
                                for i in data, orient="columns")

print(df)

输出:

                                       CompanyA  CompanyB
ProfitLoss 2018-10-08 11:19:09.006375         0         2
           2019-10-08 11:19:09.006375         1         3
Revenue    2018-10-08 11:19:09.006375         1         4
           2019-10-08 11:19:09.006375         2         5

【讨论】:

Edgar,感谢您抽出宝贵时间回答我的问题。按照您的示例,我得到了与使用 Pandas MultiIndex 之前相同的结果。在这两种情况下,我都得到了正确的表格格式,但表格内没有数据,只有 NaN。日期格式( datetime.date(2018, 3, 31): 1.0 )是否与错误填充表格有关? @edmond-dantes,检查你的字典结构。我认为dictionary = 'CompanyA': 'Revenue': date1 : $1, date2: $2,... 应该是dictionary = 'CompanyA': 'Revenue': date1 : $1, date2: $2,... 原始字典的结构 没关系,我放错了 ,抱歉!继续这个,根据 GitHub 上的这篇文章,看起来有一个错误。这正是我的日期问题:[github.com/pandas-dev/pandas/issues/19993] 我会考虑回答我的问题!

以上是关于嵌套字典到熊猫 df的主要内容,如果未能解决你的问题,请参考以下文章

从几个嵌套字典制作熊猫数据框

将列表字典映射到熊猫 df

将命名元组嵌套字典到熊猫数据框

来自熊猫数据框嵌套字典的熊猫数据框

在循环中将字典附加到熊猫数据框

如何在嵌套字典中按元素访问熊猫多索引?