Преобразовать Nested JSON в CSV, используя Pandas - PullRequest
0 голосов
/ 20 марта 2020

Я пытаюсь преобразовать вложенный JSON в CSV, используя pandas. Я просмотрел похожие вопросы, заданные здесь, но я не могу применить свой сценарий. Мой JSON следующий

{
 "51% FIFTY ONE PERCENT(PWD)" : {
 "ID" : "51%1574233975114-WEBAD",
 "contactName" : "",
 "createdAt" : 1574233975,
 "debit" : 118268.19999999995,
 "defaultCompany" : "",
 "emailAddress" : "",
 "lastUpdatedAt" : "",
 "phoneNumber" : "",
 "taskNumber" : 0
},
 "51% STORE (MUZ)" : {
 "ID" : "51%1576650784631-WEBAD",
 "contactName" : "",
 "createdAt" : 1576650784,
 "debit" : 63860,
 "defaultCompany" : "",
 "emailAddress" : "",
 "lastUpdatedAt" : "",
 "phoneNumber" : "",
 "taskNumber" : 0
},
 "ABBOTT S" : {
  "STORE (ABD)" : {
   "ID" : "ABB1574833257715-WEBAD",
   "contactName" : "",
   "createdAt" : 1574833257,
   "debit" : 35065,
   "defaultCompany" : "",
   "emailAddress" : "",
   "lastUpdatedAt" : "",
   "phoneNumber" : "",
   "taskNumber" : 0
 }
}
}

Это фрагмент JSON, и, как вы можете видеть, некоторые записи, не все, являются вложенными. Я попытался использовать json_normalize следующим образом, т.е.

import json
from pandas.io.json import json_normalize  

with open('.\Customers\kontrolkotlin-CUSTOMERS-export.json') as f:
d = json.load(f)

nycphil = json_normalize(data = d)
nycphil

, и получил в качестве выходных данных однострочный кадр данных, как показано ниже enter image description here Это не сработает, как я хочу что-то читаемое и понятное.

Ответы [ 2 ]

0 голосов
/ 20 марта 2020

Я уверен, что есть более простое слово, но ...

Если вы предполагаете, что листья вашего вложенного JSON имеют одинаковые поля (ID, contactName, et c ...), тогда вы можете рекурсивно сгладить вашу JSON и создать список записей, сохраняя путь, который привел вас к листу.

Что-то вроде:

def flatten_json(x, path="", result=None):
    if result is None:
        result=[]
    if "ID" in x:
        result.append({**x, "path": path})
        return
    for key in x:
        flatten_json(x[key], path + "/" + key, result)
    return result

df = pd.DataFrame(flatten_json(data))
print(df)

результат:

                       ID contactName   createdAt     debit defaultCompany  \
0  51%1574233975114-WEBAD              1574233975  118268.2                  
1  51%1576650784631-WEBAD              1576650784   63860.0                  
2  ABB1574833257715-WEBAD              1574833257   35065.0                  

  emailAddress lastUpdatedAt phoneNumber  taskNumber  \
0                                                  0   
1                                                  0   
2                                                  0   

                          path  
0  /51% FIFTY ONE PERCENT(PWD)  
1             /51% STORE (MUZ)  
2        /ABBOTT S/STORE (ABD)  
0 голосов
/ 20 марта 2020

Вы можете получить прямые данные, например:

nycphil = json_normalize(d['51% STORE (MUZ)'])
nycphil.head(3)
print(nycphil.head(3))

enter image description here

Или попробуйте сделать что-то подобное

df = read_json('some.json')
df.to_csv() 
print(df)

выход enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...