Python每日一记41>>>groupby 和flatten使用

我的源数据是每个会员卡的每笔消费,主要包括字段卡号,交易时间,销售金额
我想要做的事是求每个卡号的消费天数,及这个会员的消费金额
源数据如下
在这里插入图片描述
想要得到的结果如下,注意卡号一列就是代表天数
在这里插入图片描述
代码如下:
在这里插入图片描述

首先我们先不看正确的代码,我想要回溯一下我走过的坑
我们要得到最后的结果,第一步就要先得到下面的表,也就是我们要看各个卡号在那些日期消费过,且金额是多少
在这里插入图片描述
,要得到这个表很简单,无论你是用excel的数据透视表还是python的数据透视表我们都可以得到
pb=pd.pivot_table(a,index=[‘卡号’,‘日期’],values=‘销售金额’,aggfunc=np.sum)
但是,我们得到的pb,卡号和日期都是索引,我们无法直接对其操作,解决办法是导出后在读取,就能得到数据,而不是索引,但是我们会得到空值,这个时候我们还需要填充,用.fillna(method=ffill)
然后我们在利用.groupby(by=[‘卡号’]).agg({‘日期’:len,‘销售金额’:np.sum})
这样是可以得到结果的,但是问题是我们中途的转化成本很高。

于是乎,最开始给出的代码就能更加简单
在这里插入图片描述
我们看一下gr1得到的结果
在这里插入图片描述
我们发现直接得到了我们想要的中间环节,也就是我们想要得到的各个卡号在那些日期消费过,且金额是多少
并且卡号和日期都不是索引,而且没有空值,这是参数as_index=False的功劳
False表示不将分组标签当作索引,这是pb=pd.pivot_table(a,index=[‘卡号’,‘日期’],values=‘销售金额’,aggfunc=np.sum)无法做到的
接下来我们就可以利用gropby和agg进行操作了,注意我们agg内是将卡号计数,,因为我们上述的中间环节的结构,
对卡号计数就代表这个卡号的消费天数,然后再汇总金额即可。当然你也可以选择对日期计数,gr2=gr1[[‘卡号’,‘日期’,‘销售金额’]].groupby(by=[‘卡号’]).agg({‘日期’:len,‘销售金额’:np.sum}),即可
如果对gropby和agg函数不太了解的,可以自行去查阅资料哦,记住gropby是分组函数,分组后要结合函数才能输出结果,agg函数则是对分组数据进行函数的运算,可以接受字典哦,即对不同的字段进行不同的计算。
以上,简易不要使用循环解决,因为本人几十万的数据,速度很慢,如果分类汇总能利用函数,就不要自己用循环了,很费时间。

接下来我们看看flatten,这是一个隶属于numpy的函数,平展函数,pandas是无法使用的
但是我们读取数据大部分都用的pandas,我们如何使用flatten呢?如下,我我们如何将这些号码合并成一列呢
在这里插入图片描述
我们只需要用pandas读取,再用numpy转换,再使用flatten即可
在这里插入图片描述
注意flatten(‘F’),表示纵向平展哦
另外reshape函数也是numpy的,pandas想要使用,也需要转换成numpy即可哦

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值