Вложенный Json для pandas DataFrame с определенным форматом
Мне нужно отформатировать содержимое Json файла в определенном формате в pandas DataFrame, чтобы я мог запустить pandassql, чтобы преобразовать данные и запустить их через скоринговую модель.
file = C:\scoring_model\json.js (содержимое "файла" указано ниже)
{
"response":{
"version":"1.1",
"token":"dsfgf",
"body":{
"customer":{
"customer_id":"1234567",
"verified":"true"
},
"contact":{
"email":"[email protected]",
"mobile_number":"0123456789"
},
"personal":{
"gender": "m",
"title":"Dr.",
"last_name":"Muster",
"first_name":"Max",
"family_status":"single",
"dob":"1985-12-23",
}
}
}
Мне нужно, чтобы dataframe выглядел так (очевидно, все значения в той же строке, как можно лучше форматировать его для этого вопроса):
version | token | customer_id | verified | email | mobile_number | gender |
1.1 | dsfgf | 1234567 | true | [email protected] | 0123456789 | m |
title | last_name | first_name |family_status | dob
Dr. | Muster | Max | single | 23.12.1985
Я рассмотрел все остальные вопросы по этой теме, попробовал различные способы загрузки Json файла в панды
'with open(r'C:\scoring_model\json.js', 'r') as f:'
c = pd.read_json(f.read())
'with open(r'C:\scoring_model\json.js', 'r') as f:'
c = f.readlines()
попробовал pd.Panel() в этом решении Python Pandas: как разбить отсортированный словарь в столбце фрейма данных
с результатами dataframe из [yo = f.readlines()] думал о попытке разделить содержимое каждой ячейки на основе ("") и найти способ поместить разделенное содержимое в разные столбцы, но пока не повезло. Ваш опыт высоко ценится. Заранее спасибо.
Ответы
Ответ 1
Если вы загружаете весь json как dict (или список), например, используя json.load, вы можете использовать json_normalize
:
In [11]: d = {"response": {"body": {"contact": {"email": "[email protected]", "mobile_number": "0123456789"}, "personal": {"last_name": "Muster", "gender": "m", "first_name": "Max", "dob": "1985-12-23", "family_status": "single", "title": "Dr."}, "customer": {"verified": "true", "customer_id": "1234567"}}, "token": "dsfgf", "version": "1.1"}}
In [12]: df = pd.io.json.json_normalize(d)
In [13]: df.columns = df.columns.map(lambda x: x.split(".")[-1])
In [14]: df
Out[14]:
email mobile_number customer_id verified dob family_status first_name gender last_name title token version
0 [email protected] 0123456789 1234567 true 1985-12-23 single Max m Muster Dr. dsfgf 1.1