您的位置:首页 > 编程语言 > Python开发

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

2019-04-27 11:35 295 查看

我的源数据是每个会员卡的每笔消费,主要包括字段卡号,交易时间,销售金额
我想要做的事是求每个卡号的消费天数,及这个会员的消费金额
源数据如下

想要得到的结果如下,注意卡号一列就是代表天数

代码如下:

首先我们先不看正确的代码,我想要回溯一下我走过的坑
我们要得到最后的结果,第一步就要先得到下面的表,也就是我们要看各个卡号在那些日期消费过,且金额是多少

,要得到这个表很简单,无论你是用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内是将卡号计数,而不是日期计数,因为我们上述的中间环节的结构,
对卡号计数就代表这个卡号的消费天数,然后再汇总金额即可。
如果对gropby和agg函数不太了解的,可以自行去查阅资料哦,记住gropby是分组函数,分组后要结合函数才能输出结果,agg函数则是对分组数据进行函数的运算,可以接受字典哦,即对不同的字段进行不同的计算。
以上,简易不要使用循环解决,因为本人几十万的数据,速度很慢,如果分类汇总能利用函数,就不要自己用循环了,很费时间。

接下来我们看看flatten,这是一个隶属于numpy的函数,平展函数,pandas是无法使用的
但是我们读取数据大部分都用的pandas,我们如何使用flatten呢?如下,我我们如何将这些号码合并成一列呢

我们只需要用pandas读取,再用numpy转换,再使用flatten即可

注意flatten(‘F’),表示纵向平展哦
另外reshape函数也是numpy的,pandas想要使用,也需要转换成numpy即可哦

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: