Создание словаря категорий в SQL и агрегирование их в Python

1

У меня довольно "кросс-платформенный" вопрос. Надеюсь, это не слишком общее.

Одна из моих таблиц, например, customers, состоит из моего идентификатора клиента и связанной с ним демографической информации. Другая таблица, например transaction, содержит все покупки от клиентов в соответствующих магазинах. Меня интересует анализ композиций корзин вместе с демографией на питоне. Следовательно, я хотел бы иметь магазины как столбцы и сумму для данных клиентов в магазинах в моей информационной кадре

Для ясности,

 select *
 from customer
 where id=1 or id=2

дает мне

 id     age      gender
 1      35       MALE
 2      57       FEMALE

а также

 select *
 from transaction
 where id=1 or id=2

дает мне

 customer_id     shop     amount
 1               2        250
 1               2        500
 2               3        100
 2               7        200
 2               11       125

Который должен заканчиваться в (предпочтительно) кадре данных Pandas как

 id     age      gender      shop_2     shop_3     shop_7   shop_11
 1      35       MALE        750        0          0        0   
 2      57       FEMALE      0          100        200      125

Таким образом, последние столбцы представляют собой агрегированные корзины клиентов.

Я попытался создать словарь python для покупок и сумм для каждого клиента в SQL следующим образом:

 select customer_id, array_agg(concat(cast(shop as varchar), ' : ', cast(amount as varchar))) as basket
 from transaction
 group by customer_id

В результате чего

 id    basket
 1     ['2 : 250', '2 : 500']
 2     ['3 : 100', '7 : 200', '11 : 125']

которые можно легко подключить к таблице клиентов.

Однако это решение не является оптимальным из-за того, что оно является строками, а не целыми числами внутри []. Следовательно, это связано с большим количеством манипуляций и циклов в python, чтобы получить его в формате, который я хочу.

Есть ли способ, каким образом я могу агрегировать покупки в SQL, чтобы упростить чтение и объединение python в столбцы?

Теги:
pandas
prestodb

1 ответ

0
Лучший ответ

Одним простым решением было бы сделать агрегацию в pivot_table с помощью pivot_table на втором фрейме данных и затем merge с первого:

df2 = df2.pivot_table(columns='shop', values='amount', index='customer_id', aggfunc='sum', fill_value=0.0).reset_index()
df = pd.merge(df1, df2, left_on='id', right_on='customer_id')

Результирующий фрейм данных:

id  age  gender   2   3   7  11
 1   35    MALE 750   0   0   0
 2   57  FEMALE   0 100 200 125

Ещё вопросы

Сообщество Overcoder
Наверх
Меню