Есть ли способ преобразовать кадры данных так, чтобы их (мульти) индексы отображались на (вложенные) ключи 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. Попытка создать ключи индекса и столбцы конечного узла отдельно:
- Уровни индекса в списках словарей (
IndexLevelsToDict
) - Столбцы для каждой уникальной строки в словаре (
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)