我有一个相当“跨平台”的问题。我希望它不是太笼统。
我的一张桌子,比如customers
,包括我的客户ID及其相关的人口统计信息。另一张桌子,比如transaction
,包含了各个商店的顾客的所有购买。我有兴趣在python中分析篮子组合和人口统计学。因此,我希望在我的数据框中将商店作为列和商店中给定客户的总和
为清楚起见,
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
这样最后一列就是客户的聚合篮子。
我试图通过以下方式为SQL中的每个客户创建一个python词典,包括购买量和金额:
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
在pandas中进行聚合,然后在第一个数据帧中使用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