在SQL中创建分类词典并在Python中进行汇总

时间:2018-08-31 08:04:59

标签: python sql pandas presto

我有一个相当“跨平台的”问题。我希望它不是太笼统。

我的一个表,例如let timestampDiffs = [3, 2, 4]; (async () => { for (let item of timestampDiffs) { await timeout(item * 1000); console.log('waited: ' + item); } })(); function timeout(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } ,由我的客户ID及其相关的受众特征信息组成。另一个表,customers,包含从各个商店的顾客那里购买的所有商品。 我对分析篮子组成以及python中的受众特征感兴趣。因此,我想将商店作为列,并在我的数据框中将商店中给定客户的总和作为

为清楚起见,

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

应该以(最好是)Pandas数据框结尾

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

最后一列是客户的汇总篮子。

我已尝试通过以下方式为SQL中的每个客户创建一个有关购买和金额的python字典:

 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

产生

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

可以很容易地加入到客户表中。

但是,由于它是字符串而不是[]中的整数,因此该解决方案不是最佳的。因此,要在我想要的格式上进行处理,需要在python中进行大量的操作和循环。

有什么方法可以在SQL中汇总购买的内容,从而使python更容易读取并汇总到列中?

1 个答案:

答案 0 :(得分:0)

一个简单的解决方案是在第二个数据帧上使用pivot_table,然后在第一个数据帧上使用merge,以熊猫为单位进行聚合:

<Window x:Class="dragdropButton.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:dragdropButton"
        mc:Ignorable="d"
        Title="MainWindow" Height="418" Width="779"
        PreviewMouseMove="Window_PreviewMouseMove">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition Width="0*"/>
            <ColumnDefinition Width="0*"/>
        </Grid.ColumnDefinitions>
        <Button x:Name="button" HorizontalAlignment="Left" Margin="241,167,0,0" VerticalAlignment="Top" Width="75" MouseUp="button_MouseUp" MouseDown="button_MouseDown" Height="40"/>
    </Grid>
</Window>

结果数据框:

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')