Есть ли способ преобразовать кадры данных так, чтобы их (мульти) индексы отображались на (вложенные) ключи JSON?

Я не вижу способа сделать это через .to_JSON() поэтому я пытался написать функцию, которая может принимать фрейм данных и возвращать объект JSON, вложенный для каждого уровня индекса фрейма данных


Пример моих попыток:

1. Фиктивный фрейм данных...

Фиктивная датафрейм

import pandas as pd
import numpy as np
import random 

myDF = pd.DataFrame({'key1': ['a', 'a', 'a', 'b', 'b', 'c'], 
                   'key2': ['one', 'two', 'one', 'one', 'two', 'one'], 
                   'key3': ['1','3','5','7','9','11'],
                   'data1': ['0.5', '1.2','0.9','1.8','0.2','5.3'], 
                   'data2': ['0.5', '1.7','1.1','6.7','0.1','4.3'],
                  }).set_index(['key1','key2','key3'])

2. Желаемый вывод...

Используя каждый key индекса dataframe для сортировки и вложения вывода JSON...

[{"a": 
    [{"one":
            [{"1": {"data1": "0.5", "data2": "0.5"} },
             {"5": {"data1": "0.9", "data2": "1.1"} }
            ]
        },
        {"two":
            [{"3": {"data1": "1.2", "data2": "1.7"} }
            ]
        }
    ]
},
{"b":
    [{"one":
            [{"7": {"data1": "1.8", "data2": "6.7"} }
            ]
         },
         {"two":
            [{"9": {"data1": "0.2", "data2": "0.1"} }
            ]
         }
    ]
},
{"c":
    [{"one":
            [{"11": {"data1": "5.3", "data2": "4.3"} }
            ]
        }
    ]
}]

3. Моя попытка до сих пор...

3.1. Непосредственная настройка вложенных ключей / значений:

from collections import defaultdict

def toNestedJSON(df):
    json=defaultdict(dict)
    df.sort_index(inplace=True)
    for i, value in df.iterrows():
        for col in df.columns:
            json[i[0]][i[1]]=value[1]
    return json

toNestedJSON(myDF)

3.2. Попытка создать ключи индекса и столбцы конечного узла отдельно:

  1. Уровни индекса в списках словарей (IndexLevelsToDict)
  2. Столбцы для каждой уникальной строки в словаре (IndexLevelN)

Чем больше я пытаюсь, тем больше я уверен, что это не питонский способ приблизиться к нему (ПРИМЕЧАНИЕ: мой terminalDict значения возвращаются в виде списков непреднамеренно):

from collections import defaultdict

def IndexLevelN(x):
    a={}
    for column in x.columns.values:
        a[column]=x[column]
    return a

def IndexLevelsToDict(x):
    nestedDict=defaultdict(dict)
    nLevels=x.index.nlevels
    for i in range(0, nLevels-1, 1):
        a=nestedDict[ x.groupby(level=i) ]
    return a

def multiIndexToJSON(df):
    df.sort_index(inplace=True)
    dfKeys=[y for y in myDF.index.names]
    indexDicts=myDF.groupby(dfKeys).apply(IndexLevelsToDict)
    terminalDict=myDF.groupby(dfKeys).apply(IndexLevelN)
    return indexDicts
    #return terminalDict

multiIndexToJSON(myDF)

0 ответов

Другие вопросы по тегам