【问题标题】:JSON to CSV output using pandas使用 pandas 的 JSON 到 CSV 输出
【发布时间】:2021-07-11 13:56:27
【问题描述】:

我正在尝试使用 pandas 将以下 .json 文件转换为 .csv

输入json文件名:my_json_file.json

{  
   "profile_set":[  
      {  
         "doc_type":"PROFILE",
         "key":"123",
         "mem_list":{  
            "mem_num":"10001",
            "current_flag":"Y",
            "mem_flag":[  

            ],
            "child_mem_list":{  
               "child_mem_num":[  

               ]
            }
         },
         "first_name":"Robert",
         "middle_name":[  

         ],
         "last_name":"John",
         "created_datetime":"2018-01-06T12:52:09"
      },
      {  
         "doc_type":"PROFILE",
         "key":"456",
         "mem_list":{  
            "mem_num":"10002",
            "current_flag":"Y",
            "mem_flag":"Y",
            "child_mem_list":{  
               "child_mem_num":[  

               ]
            }
         },
         "first_name":"Lily",
         "middle_name":[  

         ],
         "last_name":"Hubert",
         "created_datetime":"2018-01-07T11:32:07"
      }
   ]
}

想要的输出是my_csv_file.csv

doc_type    key mem_num current_flag    mem_flag    child_mem_num   first_name  middle_name last_name   created_datetime
PROFILE     123 1001    Y                       Robert              John        2018-01-06T12:52:09
PROFILE     456 1002    Y       Y               Lily                Hubert      2018-01-07T11:32:07

我正在使用以下代码,但无法获得正确的输出。任何人都可以帮我正确获取代码吗?

代码:

import csv
import json
import pandas as pd
from pandas.io.json import json_normalize

def json_csv():

    with open('my_json_file.JSON') as data_file:
        data=json.load(data_file)
    normalized_df = pd.io.json.json_normalize(data)
    normalized_df.to_csv('my_csv_file.csv',index=False)
    return

def main():        

    json_csv() 

main()

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    试试这个:

    import pandas as pd
    
    def parse_nested_json(json_d):
        result = {}
        for key in json_d.keys():
            if not isinstance(json_d[key], dict):
                result[key] = json_d[key]
            else:
                result.update(parse_nested_json(json_d[key]))
        return result
    
    json_data = pd.read_json("my_json_file.json")
    json_list = [j[1][0] for j in json_data.iterrows()]
    parsed_list = [parse_nested_json(j) for j in json_list]
    result = pd.DataFrame(parsed_list)
    result.to_csv("my_csv_file.csv", index=False)
    

    更新(2018 年 12 月 3 日)

    我阅读了文档,有一个方便的方法:

    from pandas.io.json import json_normalize
    df = json_normalize(data["profile_set"])
    df.to_csv(...)
    

    更新(2021 年 11 月 7 日)

    pandas.io.json.json_normalize 已弃用,请改用pandas.json_normalize

    from pandas import json_normalize
    df = json_normalize(data["profile_set"])
    df.to_csv(...)
    

    【讨论】:

    • 非常感谢。这对我有用。我刚刚将最后一行修改为 result.to_csv("my_csv_file.csv", index=False,columns=['doc_type','key','mem_num','current_flag','mem_flag','child_mem_num','first_name ','middle_name','last_name','created_datetime'])
    • 我认为关键是解析嵌套的json,你可以使用其他方式将数据写入csv文件。
    【解决方案2】:

    如果您加载 json,然后将所需的 json 部分提供给 Dataframe,那么您可以像这样得到它:

    代码:

    def json_csv(filename):
        with open(filename) as data_file:
            data = json.load(data_file)
        return pd.DataFrame(data['profile_set'])
    

    测试代码:

    print(json_csv('file1'))
    

    结果L

          created_datetime doc_type first_name  key last_name  \
    0  2018-01-06T12:52:09  PROFILE     Robert  123      John   
    1  2018-01-07T11:32:07  PROFILE       Lily  456    Hubert   
    
                                                mem_list middle_name  
    0  {'mem_num': '10001', 'current_flag': 'Y', 'mem...          []  
    1  {'mem_num': '10002', 'current_flag': 'Y', 'mem...          []  
    

    【讨论】:

    • 谢谢。但我仍然需要将 mem_num、mem_flag、child_mem_num、current_flag 和 middle_name 分隔到最终输出中的单独字段中。你能帮忙吗
    猜你喜欢
    • 2021-04-12
    • 1970-01-01
    • 2019-03-05
    • 1970-01-01
    • 2017-04-15
    • 1970-01-01
    • 1970-01-01
    • 2013-06-10
    • 2013-06-12
    相关资源
    最近更新 更多