使用 python 和 pandas 将多数组 json 数据转换为扁平数据框

Posted

技术标签:

【中文标题】使用 python 和 pandas 将多数组 json 数据转换为扁平数据框【英文标题】:Transforming a multi array json data into a flatterned dataframe with python and pandas 【发布时间】:2021-12-24 07:14:22 【问题描述】:

我得到一个排列的多级 JSON 响应,其中一个级别是日期,另一个级别从 API 复制较低级别数组中的数据,如下所示:


   "2021-11-04": 
      "40-41 (25-27)": 
         "sales": 26,
         "balance": 480,
         "size_name": "40-41",
         "size_origin": "25-27"
      ,
      "42-43 (27-29)": 
         "sales": 63,
         "balance": 817,
         "size_name": "42-43",
         "size_origin": "27-29"
      
   ,
   "2021-11-05": 
      "40-41 (25-27)": 
         "sales": 35,
         "balance": 445,
         "size_name": "40-41",
         "size_origin": "25-27"
      ,
      "42-43 (27-29)": 
         "sales": 95,
         "balance": 725,
         "size_name": "42-43",
         "size_origin": "27-29"
      
   

但我需要让它不是一个数组,而是一个扁平化的对象,以便轻松地用 pandas 形成一个数据框。怎么做?

需要的结果:


   
    "day": "2021-11-04",
    "sales": 26,
    "balance": 480,
    "size_name": "40-41",
    "size_origin": "25-27"
  ,
  
    "day": "2021-11-04",
    "sales": 63,
    "balance": 817,
    "size_name": "42-43",
    "size_origin": "27-29"
   ,
    
    "day": "2021-11-05",
    "sales": 35,
    "balance": 445,
    "size_name": "40-41",
    "size_origin": "25-27"
  ,
  
    "day": "2021-11-05",
    "sales": 95,
    "balance": 725,
    "size_name": "42-43",
    "size_origin": "27-29"
   

我可以在 pandas 中转换它,而不是 JSON 格式,但我仍然不明白如何转换这种结构。

【问题讨论】:

结果不是有效的 JSON 格式。如果你想拥有一个对象数组,这 1 行可以给你你需要的东西[ **vv, **'day': k for k, v in data.items() for _, vv in v.items()] 【参考方案1】:

你可以用一个简单的双循环来做到这一点

data = 
   "2021-11-04": 
      "40-41 (25-27)": 
         "sales": 26,
         "balance": 480,
         "size_name": "40-41",
         "size_origin": "25-27"
      ,
      "42-43 (27-29)": 
         "sales": 63,
         "balance": 817,
         "size_name": "42-43",
         "size_origin": "27-29"
      
   ,
   "2021-11-05": 
      "40-41 (25-27)": 
         "sales": 35,
         "balance": 445,
         "size_name": "40-41",
         "size_origin": "25-27"
      ,
      "42-43 (27-29)": 
         "sales": 95,
         "balance": 725,
         "size_name": "42-43",
         "size_origin": "27-29"
      
   


records = []
for date, date_dict in data.items():
    for rec_id, rec in date_dict.items():
        rec['day'] = date 
        records.append(rec)

输出

>>> records

['sales': 26,
  'balance': 480,
  'size_name': '40-41',
  'size_origin': '25-27',
  'day': '2021-11-04',
 'sales': 63,
  'balance': 817,
  'size_name': '42-43',
  'size_origin': '27-29',
  'day': '2021-11-04',
 'sales': 35,
  'balance': 445,
  'size_name': '40-41',
  'size_origin': '25-27',
  'day': '2021-11-05',
 'sales': 95,
  'balance': 725,
  'size_name': '42-43',
  'size_origin': '27-29',
  'day': '2021-11-05']

>>> pd.DataFrame(records)

   sales  balance size_name size_origin         day
0     26      480     40-41       25-27  2021-11-04
1     63      817     42-43       27-29  2021-11-04
2     35      445     40-41       25-27  2021-11-05
3     95      725     42-43       27-29  2021-11-05

【讨论】:

以上是关于使用 python 和 pandas 将多数组 json 数据转换为扁平数据框的主要内容,如果未能解决你的问题,请参考以下文章

将 loc 代码行组合成 1 个函数 python pandas

使用 pandas.DataFrame.mode 和 groupby 在数据框中找到大多数 [重复]

在 Python 中使用 Excel 文件作为 pandas 数据框的映射

Pandas介绍

Python pandas 将 groupby 对象中的每个组打印为单行

将不同的功能应用于组对象中的不同项目:Python pandas