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内是将卡号计数,而不是日期计数,因为我们上述的中间环节的结构,
对卡号计数就代表这个卡号的消费天数,然后再汇总金额即可。
如果对gropby和agg函数不太了解的,可以自行去查阅资料哦,记住gropby是分组函数,分组后要结合函数才能输出结果,agg函数则是对分组数据进行函数的运算,可以接受字典哦,即对不同的字段进行不同的计算。
以上,简易不要使用循环解决,因为本人几十万的数据,速度很慢,如果分类汇总能利用函数,就不要自己用循环了,很费时间。
接下来我们看看flatten,这是一个隶属于numpy的函数,平展函数,pandas是无法使用的
但是我们读取数据大部分都用的pandas,我们如何使用flatten呢?如下,我我们如何将这些号码合并成一列呢
我们只需要用pandas读取,再用numpy转换,再使用flatten即可
注意flatten(‘F’),表示纵向平展哦
另外reshape函数也是numpy的,pandas想要使用,也需要转换成numpy即可哦
- 使用Python的groupby实现压缩功能
- 每日一记之选择城市的三级联动使用的是wheel组件
- 使用Python脚本将Bing的每日图片作为桌面的教程
- iOS 每日一记-------简单的地百度地图的使用 简单地定位
- python调用autoit组件自动使用plsqldev导出每日需要的业务报表
- python-41: 直接使用cookies登陆网站
- 老男孩教育每日一题-2017-04-17:使用Shell或Python写一个脚本,CPU使用率超过80%或硬盘超过85%邮件报警
- 《每日一课》Python入门之datetime内置模块的使用
- 每日一记之ASimpleCache缓存框架的使用方法
- 每日一记-Git使用中遇到的小问题
- [每日一记] Python报错 综述
- Pyhton每日练习 08 使用 Python 生成类似于下图中的字母+数字验证码图片
- python每日一小记(4)--使用dict和set
- python使用itertools的groupby来处理数据
- 使用python-groupby制作数据透视表1
- 【每日一记3.16】python学习记录2--字符串方法
- 使用python编写每日构建工具
- 每日一记======>Linux下查找字符串命令的使用
- 使用Python脚本将Bing的每日图片作为桌面的教程
- 每日一记-Git的学习使用