Как в панд мы можем переходить из одной формы в другую?

#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. Да, я отметил ваш ответ как решение.