簡體   English   中英

如何在 Python 中對 JSON 進行分組和格式化

[英]How to group and format JSON in Python

我想使用 Python 將此 JSON 字符串轉換為另一種格式。 結果還需要按關鍵列(組、源)進行分組。 “月”值將用作 JSON 的關鍵字段。 金額將分別更改為價格 1 和價格 2。

[{
    "month": "2022-10-21",
    "group" : "value_1",
    "source" : "source",
    "amount_1" : 10,
    "amount_2" : 100

},
{
    "month": "2022-08-21",
    "group" : "value_2",
    "source" : "source",
    "amount_1" : 20,
    "amount_2" : 50
},
{
    "month": "2022-08-21",
    "group" : "value_3",
    "source" : "source",
    "amount_1" : 30,
    "amount_2" : 50
},
{
    "month": "2022-09-21",
    "group" : "value_3",
    "source" : "source",
    "amount_1" : 40,
    "amount_2" : 60
}]

這是預期的結果。

[{
    "group": "value_1",
    "source" : "source",
    "price1" : {
        "2020-08-01" : 0,
        "2020-09-01" : 0,
        "2020-10-01" : 10
    },
    "price2" : {
        "2020-08-01" : 0,
        "2020-09-01" : 0,
        "2020-10-01" : 100
    }
},
{
    "group": "value_2",
    "source" : "source",
    "price1" : {
        "2020-08-01" : 20,
        "2020-09-01" : 0,
        "2020-10-01" : 0
    },
    "price2" : {
        "2020-08-01" : 50,
        "2020-09-01" : 0,
        "2020-10-01" : 0
    }
},
{
    "group": "value_3",
    "source" : "source",
    "price1" : {
        "2020-08-01" : 30,
        "2020-09-01" : 40,
        "2020-10-01" : 0
    },
    "price2" : {
        "2020-08-01" : 80,
        "2020-09-01" : 60,
        "2020-10-01" : 0
    }

}]

有關如何執行此操作的任何建議/庫/代碼示例? 謝謝你。

你需要:

  1. 加載 json 字符串
  2. 遍歷結果列表
  3. 在每個條目中讀取字典中的值
  4. 將它們放在新結構中

對於新結構,我會將它們放入由該組鍵入的字典中。 完成后組織該字典中的數據(您將需要每個價格的嵌套字典(使用它們作為鍵))。 迭代字典條目並獲取鍵(組)並將其與數據的 rest 一起放入字典中,並將該結果添加到列表中。

您可以使用pandas來讀取json並按 `

但稍后可能需要for -loop 來創建新的json

data = [{
    "month": "2022-10-21",
    "group" : "value_1",
    "source" : "source",
    "amount_1" : 10,
    "amount_2" : 100

},
{
    "month": "2022-08-21",
    "group" : "value_2",
    "source" : "source",
    "amount_1" : 20,
    "amount_2" : 50
},
{
    "month": "2022-08-21",
    "group" : "value_3",
    "source" : "source",
    "amount_1" : 30,
    "amount_2" : 50
},
{
    "month": "2022-09-21",
    "group" : "value_3",
    "source" : "source",
    "amount_1" : 40,
    "amount_2" : 60
}]

import pandas as pd
import json

#with open('filename.json') as fh:
#    data = json.load(fh)

df = pd.DataFrame(data)
print(df)

all_dates = sorted(df['month'].unique())
print('all_dates:', all_dates)

all_items = []

for key, val in df.groupby(['group', 'source']):
    item = {'group': key[0], 'source': key[1], 'price1': {}, 'price2': {}}
    for date in all_dates:
        rows = val[ val['month'] == date ].reset_index(drop=True)
        item['price1'][date] = int(rows['amount_1'].get(0, 0))
        item['price2'][date] = int(rows['amount_2'].get(0, 0))
    all_items.append(item)
    
print(json.dumps(all_items, indent=2))    

結果:

        month    group  source  amount_1  amount_2
0  2022-10-21  value_1  source        10       100
1  2022-08-21  value_2  source        20        50
2  2022-08-21  value_3  source        30        50
3  2022-09-21  value_3  source        40        60

all_dates: ['2022-08-21', '2022-09-21', '2022-10-21']

[
  {
    "group": "value_1",
    "source": "source",
    "price1": {
      "2022-08-21": 0,
      "2022-09-21": 0,
      "2022-10-21": 10
    },
    "price2": {
      "2022-08-21": 0,
      "2022-09-21": 0,
      "2022-10-21": 100
    }
  },
  {
    "group": "value_2",
    "source": "source",
    "price1": {
      "2022-08-21": 20,
      "2022-09-21": 0,
      "2022-10-21": 0
    },
    "price2": {
      "2022-08-21": 50,
      "2022-09-21": 0,
      "2022-10-21": 0
    }
  },
  {
    "group": "value_3",
    "source": "source",
    "price1": {
      "2022-08-21": 30,
      "2022-09-21": 40,
      "2022-10-21": 0
    },
    "price2": {
      "2022-08-21": 50,
      "2022-09-21": 60,
      "2022-10-21": 0
    }
  }
]

暫無
暫無

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

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