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

我的源数据是每个会员卡的每笔消费,主要包括字段卡号,交易时间,销售金额
我想要做的事是求每个卡号的消费天数,及这个会员的消费金额
源数据如下
Python每日一记41>>>groupby 和flatten使用_第1张图片
想要得到的结果如下,注意卡号一列就是代表天数
Python每日一记41>>>groupby 和flatten使用_第2张图片
代码如下:
Python每日一记41>>>groupby 和flatten使用_第3张图片

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

于是乎,最开始给出的代码就能更加简单
Python每日一记41>>>groupby 和flatten使用_第5张图片
我们看一下gr1得到的结果
Python每日一记41>>>groupby 和flatten使用_第6张图片
我们发现直接得到了我们想要的中间环节,也就是我们想要得到的各个卡号在那些日期消费过,且金额是多少
并且卡号和日期都不是索引,而且没有空值,这是参数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呢?如下,我我们如何将这些号码合并成一列呢
Python每日一记41>>>groupby 和flatten使用_第7张图片
我们只需要用pandas读取,再用numpy转换,再使用flatten即可
Python每日一记41>>>groupby 和flatten使用_第8张图片
注意flatten(‘F’),表示纵向平展哦
另外reshape函数也是numpy的,pandas想要使用,也需要转换成numpy即可哦

你可能感兴趣的:(Python每日一记41>>>groupby 和flatten使用)