【问题标题】:multiple object of an array creates different columns in the CSV file数组的多个对象在 CSV 文件中创建不同的列
【发布时间】:2022-11-17 20:16:36
【问题描述】:

这是我的 JSON 示例。当我将 JSON 转换为 CSV 文件时,它会为 reviews 数组的每个对象创建不同的列。列名称类似于 - serial name.0 rating.0 _id.0 name.1 rating.1 _id.1。我如何转换为 CSV 文件,其中只有 serial、name、rating、_id 将是列名称,并且评论的每个对象都将放在不同的行中?

`

[{
    "serial":  "63708940a8d291c502be815f",
    "reviews": [
      {
        "name": "shadman",
        "rating": 4,
        "_id":"6373d4eb50cff661989f3d83"      
      },
      {
        "name": "niloy1",
        "rating": 3,
        "_id": "6373d59450cff661989f3db8"    
      }, 
    ],
  }]

`

`

我正在尝试将 CSV 文件用于熊猫。如果不可能,有没有办法在 python 中使用 pandas 包来解决问题?

【问题讨论】:

    标签: json pandas mongodb csv export-to-csv


    【解决方案1】:

    我建议您仅将 pandas 用于 CSV 导出,并通过首先展平数据结构来处理 json 数据,以便随后可以轻松地将结果加载到 Pandas DataFrame 中。

    尝试:

    data_json = """
    [{
        "serial":  "63708940a8d291c502be815f",
        "reviews": [
          {
            "name": "shadman",
            "rating": 4,
            "_id":"6373d4eb50cff661989f3d83"      
          },
          {
            "name": "niloy1",
            "rating": 3,
            "_id": "6373d59450cff661989f3db8"    
          }, 
        ],
     }]"""
    
    data_python = eval(data_json)
    
    from collections import defaultdict
    from pprint import pprint
    import pandas as pd
    
    dct_flat = defaultdict(list)
    for dct in data_python:
        for dct_reviews in dct["reviews"]:
            dct_flat['serial'].append(dct['serial']) 
            for key, value in dct_reviews.items():
                dct_flat[key].append(value)
    
    #pprint(data_python)
    #pprint(dct_flat)
    df = pd.DataFrame(dct_flat)
    print(df) 
    

    这使:

                         serial     name  rating                       _id
    0  63708940a8d291c502be815f  shadman       4  6373d4eb50cff661989f3d83
    1  63708940a8d291c502be815f   niloy1       3  6373d59450cff661989f3db8
    

    请注意,您在问题中提供的 json 无法从文件加载到 Python 中,因为它不是有效的 json 代码。请参阅下面的更正 json 数据:

    valid_json_data='''
    [{
        "serial":  "63708940a8d291c502be815f",
        "reviews": [
          {
            "name": "shadman",
            "rating": 4,
            "_id":"6373d4eb50cff661989f3d83"      
          },
          {
            "name": "niloy1",
            "rating": 3,
            "_id": "6373d59450cff661989f3db8"    
          } 
        ]
    }]
    '''
    

    以及从 json 文件加载此数据的代码:

    import json
    json_file = "data.json"
    with open(json_file) as f:
        data_json = f.read()
        data_python = json.loads(data_json)
    

    【讨论】:

      猜你喜欢
      • 2021-07-31
      • 2023-03-12
      • 2020-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多