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

我在stackoverflow中的第一个问题!

我有一个三重嵌套字典,我想将其转换为 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,..} 
ProfitLoss{date1:$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) 并更改索引,但没有结果。知道下一步该怎么做吗?任何提示将不胜感激!

【问题讨论】:

标签: pandas dictionary multi-index


【解决方案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]
  • 我会考虑回答我的问题!
猜你喜欢
  • 1970-01-01
  • 2018-08-13
  • 2023-03-23
  • 2018-04-14
  • 1970-01-01
  • 2015-10-11
  • 1970-01-01
  • 2021-04-30
相关资源
最近更新 更多