pandas:由列层次化索引延伸的一些思考
1. 删除列层次化索引
用pandas利用df.groupby.agg() 做聚合运算时遇到一个问题:产生了列方向上的两级索引,且需要删除一级索引。具体代码如下:
# 每个uesr每天消费金额统计:和、均值、最大值、最小值、消费次数、消费种类、
action_info = student_action.groupby(['outid','date']).agg({'opfare':['sum','mean','max','min'],
'acccode':['count','unique'],}).reset_index()
action_info 表结果如下:
删除列的层次化索引操作如下:
# 列的层次化索引的删除
levels = action_info.columns.levels
labels = action_info.columns.labels
print(levels,labels)
action_info.columns = levels[1][labels[1]]
2. agg()与apply()的区别
以 student_action表为例:
apply()方法:
agg()方法:
可以看到,apply()可以展示所有维度的数据,而agg()仅可以展示一个维度的数据。
事实上,如果值是一维数组,在利用完特定的函数之后,能做到简化的话,agg就能调用,反之,如果比如自定义的函数是排序,或者是一些些更复杂统计的函数,当然是agg所不能解决的,这时候用apply就可以解决。因为他更一般化,不存在什么简化,什么一维数组,什么标量值。且apply会将当前分组后的数据一起传入,可以返回多维数据。
例子:根据 student_action表,统计每个学生每天最高使用次数的终端、最低使用次数的终端以及最高使用次数终端的使用次数、最低使用次数终端的使用次数。
针对这个例子,有两种方法:
方法一:low到爆 永不使用!!
1. 构造每个用户每天的终端列表,需要one-hot termid
2. 构造groupby.agg()所使用的方法
2.1 列表模糊查找,找到包含'termid_'的字段名
termid_features = [x for i,x in enumerate(student_termid_onehot.columns.tolist()) if x.find('termid_')!=-1]
2.2 构造指定长度,指定元素的列表
sum_methods= ['sum'for x in range(0, len(termid_features))]
2.3 agg_methods=dict(zip(termid_features,sum_methods))
3. 每个学生每天的终端使用次数明细表
find_termid_df = student_termid_onehot.groupby(['outid','date']).agg(agg_methods).reset_index()
4. 找到student_termid_onehot中包含 'termid_'字段元素的最大值对应的字段名
4.1 构造列表保存
4.2 遍历每行数据,构造dict,并过滤value =0.0 的 k-v
4.3 找到每个dict的value值最大的key
max(filtered_statics_dict, key=filtered_statics_dict.get)
方法二:优雅直观
def transmethod(df):
"""
每个用户每天消费记录最大值、最高使用次数的终端、最低使用次数的终端
以及最高使用次数终端的使用次数、最低使用次数终端的使用次数。
df type:
outid opcount date time oddfare opfare acccode
3538 152211511101 5 2015-09-08 07:24:25 11290 200 210
6108 152211511101 6 2015-09-08 12:09:01 10440 850 210
termid
3538 13
6108 39
"""
# 每日最大消费额
maxop = df['opfare'].max()
statics_dict={}
for i in set(df['acccode'].tolist()):
statics_dict[i] = df['acccode'].tolist().count(i)
highest_termid = max(statics_dict, key=statics_dict.get)
lowhest_termid = min(statics_dict, key=statics_dict.get)
highest_termid_freq = statics_dict[highest_termid]
lowhest_termid_freq = statics_dict[lowhest_termid]
return maxop,highest_termid,highest_termid_freq,lowhest_termid,lowhest_termid_freq
groupby.apply() 组合使用:
pd.DataFrame(student_action.groupby(['outid','date']).apply(lambda x:transmethod(x)))
可以发现,apply()方法要比agg()方法灵活的多的多!
3. 总结
- 列层次索引的删除
- 列表的模糊查找方式
- 查找dict的value值最大的key 的方式
- 当做简单的聚合操作(max,min,unique等),可以使用agg(),在做复杂的聚合操作时,一定使用apply()
- “家庭贷款”域名Home.loans已经建站为家庭贷款相关的网站
- 微信亿级用户异常检测框架的设计与实践
- 程序员必知的6点编程秘诀,编程三板斧将解决90%问题!
- JavaScript之面向对象学习三原型语法升级
- 腾讯入局物业管理,欲改造传统服务?
- JavaScript之面向对象学习五(JS原生引用类型Array、Object、String等等)的原型对象介绍
- SQL学习之分组数据Group by
- SQL学习之数据列去空格函数
- 采用DIV+CSS布局对SEO优化有何好处?
- Sublime快速入门
- SQL学习之汇总数据之聚集函数
- Sedo榜单中,域名“加密世界”CryptoWorld.com七位数夺冠
- ExtJs学习笔记(20)-利用ExtJs的Ajax与服务端WCF交互
- 2018年热点分享:比特币到底是什么?
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- laravel withCount 统计关联数量的方法
- 使用laravel和ECharts实现折线图效果的例子
- Laravel 将数据表的数据导出,并生成seeds种子文件的方法
- Laravel Eloquent ORM 多条件查询的例子
- laravel5.5添加echarts实现画图功能的方法
- thinkphp5.1框架实现格式化mysql时间戳为日期的方式小结
- Laravel 创建指定表 migrate的例子
- Laravel find in set排序实例
- Laravel 对某一列进行筛选然后求和sum()的例子
- 关于laravel 数据库迁移中integer类型是无法指定长度的问题
- laravel多条件查询方法(and,or嵌套查询)
- thinkphp框架使用JWTtoken的方法详解
- Laravel创建数据库表结构的例子
- laravel按天、按小时,查询数据的实例
- 浅谈laravel中的关联查询with的问题