У меня довольно "кросс-платформенный" вопрос. Надеюсь, это не слишком общее.
Одна из моих таблиц, например, 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 в столбцы?
Одним простым решением было бы сделать агрегацию в 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