- Я бы подумал об использовании
pandas
- Используйте
.groupby
для выбора групп - Когда
.groupby
выполняется для одного столбца, группа возвращается как str
, а если .groupby
выполняется для нескольких столбцов, возвращается tuple
. o_id
- это str
который представляет собой значение, используемое для groupby
o_id
должно быть list
или tuple
, чтобы zip
с groupby_list
создавало dict
. d
- это фрейм данных для каждой группы groupby
.
- Используйте
.iterrows
для перебора строк каждой группы - Возвращает
index
, представленное первым _
, потому что это не нужно - Возвращает
data
, из которого отбрасываются метки в groupby_list
, затем преобразует остаток в dict
с помощью .to_dict()
, и добавьте его к list
, att_list
- После цикла по всем строкам группы назначьте
items_list
в качестве значения group['items']
- После прохождения каждой группы с полным рейтингом, добавьте
dict
, group
, к dict_list
. dict_list
можно преобразовать обратно в фрейм данных со следующим: df = pd.json_normalize(dict_list, 'items', meta=groupby_list)
Ожидаемый результат
{'items': [{'name': 'item6', 'product_code': '323098', 'purchase_price': 1990},
{'name': 'item7', 'product_code': '3209233', 'purchase_price': 590}],
'orderId': '012006192158-63823'}
Код для получения ожидаемого результата
import pandas as pd
import json
# read in the file
df = pd.read_csv('test.csv')
dict_list = list()
groupby_list = ['order id']
for o_id, d in df.groupby(groupby_list):
if type(o_id) != tuple:
o_id = [o_id]
group = dict(zip(groupby_list, o_id))
items_list = list()
for _, data in d.iterrows():
data = data.drop(labels=groupby_list)
items_list.append(data.to_dict())
group['items'] = items_list
dict_list.append(group)
# save to a file
with open('test.json', 'w') as f:
json.dump(dict_list, f, ensure_ascii=False)
jsonfile.write('\n')
Конечный результат: dict_list
[{
'items': [{
'name': 'item6',
'product_code': 323098,
'purchase_price': 1990
}, {
'name': 'item7',
'product_code': 320923,
'purchase_price': 590
}, {
'name': 'item8',
'product_code': 325051,
'purchase_price': 590
}, {
'name': 'item9',
'product_code': 325446,
'purchase_price': 1990
}
],
'order id': '012006192158-63823'
}, {
'items': [{
'name': 'item4',
'product_code': 326353,
'purchase_price': 1990
}, {
'name': 'item5',
'product_code': 321625,
'purchase_price': 1490
}
],
'order id': '012006221101-40527'
}, {
'items': [{
'name': 'item3',
'product_code': 329452,
'purchase_price': 1490
}
],
'order id': '012006241026-13750'
}, {
'items': [{
'name': 'item1',
'product_code': 321618,
'purchase_price': 1380
}, {
'name': 'item2',
'product_code': 321618,
'purchase_price': 690
}
],
'order id': '012006251700-68811'
}
]
test.csv
order id,name,product_code,purchase_price
012006251700-68811,item1,321618,1380
012006251700-68811,item2,321618,690
012006241026-13750,item3,329452,1490
012006221101-40527,item4,326353,1990
012006221101-40527,item5,321625,1490
012006192158-63823,item6,323098,1990
012006192158-63823,item7,320923,590
012006192158-63823,item8,325051,590
012006192158-63823,item9,325446,1990