簡體   English   中英

如何將嵌套的 json 展平為 dataframe pandas

[英]how to flattening nested json to dataframe pandas

如何像這樣將 JSON 展平為 pd.dataframe :

class_id|id |schedule_id |schedule_date |lesson_price |status`
    1   | 3 |    1       | 2017-07-11   |   USD 25    | ONGOING
    1   | 3 |    2       | 2016-09-24   |   USD 15    | OPEN REGISTRATION
    1   | 4 |    1       | 2016-12-17   |   USD 19    | ONGOING
    1   | 4 |    2       | 2015-11-12   |   USD 29    | ONGOING
    1   | 4 |    3       | 2015-11-10   |   USD 14    | ON SCHEDULE
    2   | 1 |    1       | 2017-05-21   |   USD 50    | CANCELLED
    2   | 2 |    1       | 2017-06-04   |   USD10     | FINISHED
    2   | 2 |    2       | 2018-03-01   |   USD12     | CLOSED

JSON

我已經嘗試過這個參考,但我給了我 2 行 groupby class_id

如何顯示課程 object 中的 class_id 和 id 的所有數據計划,如所需的 dataframe?

你的數據結構的困難來自於

{
  "lesson3": {
    "id": 3,
    "schedule": [
      {
        "schedule_id": "1",
        "schedule_date": "2017-07-11",
        "lesson_price": "USD 25",
        "status": "ONGOING"
      },
      {
        "schedule_id": "2",
        "schedule_date": "2016-09-24",
        "lesson_price": "USD 15",
        "status": "OPEN REGISTRATION"
      }
    ]
  }
}

最好有

{
  "name": "lesson3",
  "id": 3,
  "schedule": [
    {
      "schedule_id": "1",
      "schedule_date": "2017-07-11",
      "lesson_price": "USD 25",
      "status": "ONGOING"
    },
    {
      "schedule_id": "2",
      "schedule_date": "2016-09-24",
      "lesson_price": "USD 15",
      "status": "OPEN REGISTRATION"
    }
  ]
}

但我們無法控制大部分時間獲得的數據。 所以我們必須去掉第1課,第2課的鑰匙,把object向上移動。

解決方案

import requests
data = requests.get(url).json()

提取不同的教訓

data_ = [{'class_id': c['class_id'], 'lessons': v} for c in data['class'] for d, v in c['data'].items()]

現在的數據是這樣的

[
  {
    "class_id": "1",
    "lessons": {
      "id": 3,
      "schedule": [
        {
          "schedule_id": "1",
          "schedule_date": "2017-07-11",
          "lesson_price": "USD 25",
          "status": "ONGOING"
        },
        {
          "schedule_id": "2",
          "schedule_date": "2016-09-24",
          "lesson_price": "USD 15",
          "status": "OPEN REGISTRATION"
        }
      ]
    }
  },
  ...
]

現在我們可以使用 json_normalize 將其讀入 pandas json_normalize

df = json_normalize(data_, record_path=['lessons', 'schedule'], meta=['class_id', ['lessons', 'id']])

Output

  schedule_id schedule_date lesson_price             status class_id lessons.id
0           1    2017-07-11       USD 25            ONGOING        1          3
1           2    2016-09-24       USD 15  OPEN REGISTRATION        1          3
2           1    2016-12-17       USD 19            ONGOING        1          4
3           2    2015-11-12       USD 29            ONGOING        1          4
4           3    2015-11-10       USD 14        ON SCHEDULE        1          4
5           1    2017-05-21       USD 50          CANCELLED        2          1
6           1    2017-06-04        USD10           FINISHED        2          2
7           5    2018-03-01        USD12             CLOSED        2          2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM