我正在做一个项目,从CSV读取购买数据,并为API负载输出JSON。有多行具有相同的订单ID,因为它们中的每一行都有一个单独的项目,我希望在创建购买负载之前将这些项目合并到一个数组中
order id name product_code purchase_price
012006251700-68811 item1 321618 1380
012006251700-68811 item1 321618 690
012006241026-13750 item2 329452 1490
012006221101-40527 item3 326353 1990
012006221101-40527 item4 321625 1490
012006192158-63823 item5 323098 1990
012006192158-63823 item6 320923 590
012006192158-63823 item7 325051 590
012006192158-63823 item8 325446 1990
我已经能够从CSV导入行,并且正在检查当前购买的ID值,但是还不能得到我想要的结果
下面的代码应该检查下一行的ID值是否相同,如果相同,则只将项目详细信息添加到项目数组中
如果下一行没有相同的ID,else语句将把完整的购买添加到purchases数组中
import csv
import json
output = {'purchases': []}
items = {'items': []}
purchaseBody = {}
current_purchase = None
with open('tester - tester.csv') as csv_file:
for purchase in csv.DictReader(csv_file):
if current_purchase is not None and purchase['id'] == current_purchase['id']:
items['items'].append({'id': purchase['id'],
'name': purchase['name'],
'product_code': purchase['product_code']
'purchase_price': purchase['purchase_price'],
})
else:
purchaseBody = {
'id': purchase['id'],
'user': {'email': purchase['email']},
'total': purchase['total'],
'createdAt': purchase['createdAt']
}
items['items'].append({'id': purchase['id'],
'name': purchase['name'],
'product_code': purchase['product_code']
'purchase_price': purchase['purchase_price'],
})
output['purchases'].append(purchaseBody)
items = {'items': []}
purchaseBody.update(items)
current_purchase = purchase
with open('file.json', 'w') as jsonfile:
json.dump(output, jsonfile, ensure_ascii=False)
jsonfile.write('\n')
所需的输出应类似于以下内容:
{
"purchases": [{
"id": "purchase id",
"user": {
"email": "email"
},
"items": [{
"id": "id1",
"name": "name1",
"additionalFields": {
"product_code": "product_code1",
"purchase_price": "purchase_price1"
}
},
{
"id": "id2",
"name": "name2",
"additionalFields": {
"product_code": "product_code2",
"purchase_price": "purchase_price2"
}
}
],
"total": "total",
"createdAt": "createdAt"
}]
}
.groupby
时,该组作为str
返回,如果对多个列执行.groupby
,则返回tuple
李>o_id
是str
,表示用于groupby
的值o_id
必须是list
或tuple
才能zip
与groupby_list
一起创建dict
李>d
是每个groupby
组的数据帧李>_
表示的index
,因为不需要它data
,从中删除groupby_list
中的标签,然后使用^{dict
,并将其附加到list
,att_list
items_list
作为值分配给group['items']
dict
、group
附加到dict_list
李>dict_list
可以通过以下方式转换回数据帧:df = pd.json_normalize(dict_list, 'items', meta=groupby_list)
预期产量
生成预期输出的代码
最终输出:
dict_list
test.csv
在问题中的代码中,我认为它将通过缩进行来实现您想要的功能
所以它在
else
块内然而,这种任务——迭代集合并按键分组——可以通过使用itertools.groupby函数来简化。给定一个已排序的集合,它将为您进行分组。operator.itemgetter函数可用于减少从行字典中获取值所需的代码量
相关问题 更多 >
编程相关推荐