首页 > 解决方案 > Python csv 到嵌套 Json

问题描述

我有一个可用的 csv,我需要为它创建一个嵌套的 Json。Id 必须是根目录和子根目录中的日期,然后是所有键和值。我已将 csv 转换为 Json,但我正在努力将其转换为所需的格式。我已经在我的代码中实现了。

data = {} 
with open(csvpath, encoding='utf-8') as csvf: 
    csvReader = csv.DictReader(csvf)
    for rows in csvReader:
        key = rows['id'] 
        data[key] = rows

with open(jsonpath, 'w', encoding='utf-8') as jsonf: 
        jsonf.write(json.dumps(data, indent=4)) 

数据.csv

"id","datetime","amount","orders","quantity"
31937,27/11/2020 00:00,55.8,2,2
31937,29/11/2020 00:00,96.9,1,1
26575,27/11/2020 00:00,10.9,1,1

输出.json

{
    "31937": {
        "order_datetime": "27/11/2020 00:00",
        "amount": "55.8",
        "orders": "2",
        "quantity": "2"
    },
    "31937": {
        "order_datetime": "29/11/2020 00:00",
        "amount": "10.9",
        "orders": "1",
        "quantity": "1"
    },
    "29581": {
        "order_datetime": "27/11/2020 00:00",
        "amount": "96.9",
        "orders": "1",
        "quantity": "1"
    }
  }
}

需要输出

{
  "31937": {
    "27/11/2020 00:00": {
      "amount": 55.8,
      "orders": 2,
      "quantity": 2
    },
    "29/11/2020 00:00": {
      "amount": 96.9,
      "orders": 1,
      "quantity": 1
    }
  },
  "26575": {
    "27/11/2020 00:00": {
      "amount": 10.9,
      "orders": 1,
      "quantity": 1
    }
  }
}

标签: pythonjson

解决方案


尝试:

df.groupby(['id'])[['datetime','amount', 'orders', 'quantity']]\
.apply(lambda x: x.set_index('datetime').to_dict(orient='index')).to_dict()

输出:

{26575: {'27/11/2020 00:00': {'amount': 10.9, 'orders': 1, 'quantity': 1}},
 31937: {'27/11/2020 00:00': {'amount': 55.8, 'orders': 2, 'quantity': 2},
  '29/11/2020 00:00': {'amount': 96.9, 'orders': 1, 'quantity': 1}}}

格式化:

{
   26575:{
      "27/11/2020 00:00":{
         "amount":10.9,
         "orders":1,
         "quantity":1
      }
   },
   31937:{
      "27/11/2020 00:00":{
         "amount":55.8,
         "orders":2,
         "quantity":2
      },
      "29/11/2020 00:00":{
         "amount":96.9,
         "orders":1,
         "quantity":1
      }
   }
}
   

编辑2:

df.groupby(['id'])[['datetime','amount', 'orders', 'quantity']]

这会将数据框分组id。这个 id 将是一个 dict 键,其余的项目我必须将它转换为另一个带有datetimeas 键的字典。

因此,分组后,我将从中取出行'datetime','amount', 'orders', 'quantity'并将其datetime作为键,其余作为值。这将通过使用x.set_index('datetime').to_dict(orient='index')

使用的原因orient='index'是我希望得到这种形式的结果:{index -> {column -> value}}

这里我的索引是日期时间,所以它将是一个键,其余的值'amount', 'orders', 'quantity'将具有这种形式:

{ "27/11/2020 00:00" -> { amount -> 55.8, orders -> 1, quantity -> 2 }}


推荐阅读