Вложенный словарь для панд df - PullRequest
0 голосов
/ 08 октября 2018

Мой первый вопрос в 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) и изменить индекс без результата.Есть идеи, что делать дальше?Любая подсказка будет оценена!

1 Ответ

0 голосов
/ 08 октября 2018

Я вижу, что вы новичок, но может быть ответ на аналогичный вопрос, см. это .В следующий раз попробуйте поискать похожий вопрос, используя ключевые слова.Например, я нашел ссылку, которую нашел, выполнив поиск "pandas nested dict" , и все, первая ссылка была SO 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
...