#python #pandas
Вопрос:
У меня есть следующий сценарий на python с Пандами, ниже приведен только пример, на самом деле реальный фрейм данных возвращает 15 тыс. объектов для проектов и еще 15 тыс. объектов для продуктов
#cur is a connector to snowflake instance
rows = pd.DataFrame(cur.fetchall(), columns=['product', 'project'])
json_data = rows.to_dict(orient='dict')
print('projects_products =', json_data)
projects_products = {
"project": {
'0': 'project0',
'1': 'project0',
'2': 'project1',
'3': 'project1',
'4': 'project2',
'5': 'project2',
},
"product":{
'0': 'product1',
'1': 'product2',
'2': 'product3',
'3': 'product4',
'4': 'product5',
'5': 'product6',
}
}
Как в pandas я могу конвертировать эти данные из формата выше в формат ниже?
merged_list = [
{ "key": 'project0', "cat": 'product1' },
{ "key": 'project0', "cat": 'product2' },
{ "key": 'project1', "cat": 'product3' },
{ "key": 'project1', "cat": 'product4' },
{ "key": 'project2', "cat": 'product5' },
{ "key": 'project2', "cat": 'product6' },
]
Я пытался пойти примитивным путем, но на это уходит целая вечность
projects_products = {
"response": {
"product": { ...
},
"project": { ...
}
}
}
def convert_dict():
projects_list = []
for project in projects_products['response']['project']:
for product in projects_products['response']['product']:
if projects_products['response']['project'][project] == projects_products['response']['project'][product]:
projects_list.append({ "key": projects_products['response']['product'][product], "cat": projects_products['response']['project'][project] })
return projects_list
start = timeit.default_timer()
convert_dict()
end = timeit.default_timer()
print(end-start)
Преобразование заняло 109 секунд
$ python3 convert.py
109.38614280600001
Комментарии:
1. В
merged_list
«ключ» и «кошка»должны быть числами 0, 1, 2, … выше или просто строками «ключ» и «кошка»?2. Только строки «ключ» и «кошка»
3. На этот вопрос уже был дан ответ @Simone
Ответ №1:
rename
столбцы перед вызовом to_dict(orient='records')
:
>>> rows.rename(columns={'project': 'key', 'product': 'cat'})
.to_dict(orient='records')
[{'key': 'project0', 'cat': 'product1'},
{'key': 'project0', 'cat': 'product2'},
{'key': 'project1', 'cat': 'product3'},
{'key': 'project1', 'cat': 'product4'},
{'key': 'project2', 'cat': 'product5'},
{'key': 'project2', 'cat': 'product6'}]
Для 15 тыс. строк преобразование заняло:
>>> len(rows)
15000
>>> %timeit rows.rename(columns={'project': 'key', 'product': 'cat'}).to_dict(orient='records')
23.5 ms ± 123 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
Комментарии:
1. Да, я отметил ваш ответ как решение.