【问题标题】:Convert Nested JSON to CSV using Pandas使用 Pandas 将嵌套 JSON 转换为 CSV
【发布时间】:2020-07-01 10:18:06
【问题描述】:

我正在尝试使用 pandas 将嵌套的 JSON 转换为 CSV。我已经查看了此处提出的类似问题,但我似乎无法适用于我的场景。 我的 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 的 sn-p,您可以看到一些条目(不是全部)是嵌套的。 我尝试通过以下方式使用 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

并得到一个单行数据框作为输出,如下所示 这似乎行不通,因为我想要一些可读和可理解的东西。

【问题讨论】:

    标签: python pandas csv dataframe data-science


    【解决方案1】:

    我敢肯定有一个更简单的说法,但是......

    如果您假设嵌套 JSON 的叶子都具有相同的字段(IDcontactName 等...),那么您可以递归地展平您的 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)  
    

    【讨论】:

    • 我看不懂你那里提到的 parse_json 函数
    • 抱歉,@ZohairAbbasHadi 是错误的函数名称。我现在修复了代码。
    【解决方案2】:

    您可以直接获取数据,例如:

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

    或者尝试做这样的事情

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

    输出

    【讨论】:

    • 但是你的答案有问题,因为最后一行显示的是嵌套的 json
    猜你喜欢
    • 2017-06-10
    • 2021-08-26
    • 2019-11-14
    • 2021-12-01
    • 1970-01-01
    • 2019-12-20
    • 1970-01-01
    • 2020-03-21
    相关资源
    最近更新 更多