python - 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
}
}
}
解决方案
尝试:
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 键,其余的项目我必须将它转换为另一个带有datetime
as 键的字典。
因此,分组后,我将从中取出行'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 }}
推荐阅读
- google-pay - 如何测试草稿中的 Google Pay 课程?
- php - 使用 REST API php 在 KOHA 中传递令牌
- r - 在 R 中将 2 个图合并为 1 个图
- asp.net - ASP.NET:面板未使用 visible=true 呈现
- sql - 在选择中选择?
- javascript - 问题重新索引嵌套对象数组中的项目
- perl - Mojo::UserAgent - 在解码前检查 Content-Encoding 标头
- angular - Spring Boot + Angular 应用程序作为 WAR 部署到 Heroku,抛出 404,除非我在 URL 中包含“index.html”
- vue.js - 向列表添加多个排序/过滤选项 - 最佳方法?
- swift - Metal 似乎将 bgra8Unorm 解释为 rgba 颜色