pandas 透视表中文字段排序方法


Posted in Python onNovember 16, 2018

前几天有一个需求,透视表中的年级这一列要按照一年级,二年级这样的序列进行排序,但是用过透视表的人都知道,透视表对中文的排序不是太理想,放弃pandas自带的排序方法。测试了很久,想到一个办法。先把dataframe中需要特殊排序的列中的汉字转换成数字,然后生成透视表,生成透视表之后,再把透视表的index或者columns中的数字替换成相应的汉字,透视表的结果就会按照你想要的顺序进行排序。

def get_special_sort_data(self, groupby, columns):
 # 获取需要特殊处理的字段的信息
 special_sort_cols = None
 cols_in_index_or_column = None # 判断特殊排序字段在index还是column中
 if self.datasource.has_special_sort_cols:
  # 获取表需要处理的特殊字段信息
  special_sort_cols = self.datasource.get_sort_columns() # {"grade_name": {}}

  if special_sort_cols:
  i_intersection = list(set(groupby) & set(special_sort_cols.keys()))
  c_intersection = list(set(columns) & set(special_sort_cols.keys()))
  if i_intersection:
   cols_in_index_or_column = ('index', i_intersection)
  elif c_intersection:
   cols_in_index_or_column = ('column', c_intersection)
 return cols_in_index_or_column, special_sort_cols
cols_in_index_or_column, special_sort_cols = self.get_special_sort_data(groupby, columns) # special_sort_cols:{"grade_name": {"一年级": 1, "二年级":2, "三年级": 3 ....}}

if cols_in_index_or_column:
 for col in cols_in_index_or_column[1]:
 df[col] = df[col].replace(special_sort_cols.get(col)) # 替换df

# 获取透视表
if cols_in_index_or_column:
 if cols_in_index_or_column[0] == 'index':
  if len(groupby) == 1:
   col_name = cols_in_index_or_column[1][0]
   sort_info = special_sort_cols.get(col_name)
   r_sort_info = {v:k for k, v in zip(sort_info.keys(), sort_info.values())}
   index_1 = df.index.tolist()
   index_1 = [r_sort_info.get(item) for item in index_1]
   df.index = Index(index_1, name=df.index.name)
  else:
   for item in cols_in_index_or_column[1]:
   ix = df.index.names.index(item)
   index_1 = df.index.levels[ix].tolist()
   sort_info = special_sort_cols.get(item)
   r_sort_info = {v: k for k, v in zip(sort_info.keys(), sort_info.values())}
   index_1 = [r_sort_info.get(item) for item in index_1]
   df.index = df.index.set_levels(index_1, level=ix)
 else:
  for item in cols_in_index_or_column[1]:
  ix = df.columns.names.index(item)
  col_1 = df.columns.levels[ix].tolist()
  sort_info = special_sort_cols.get(item)
  r_sort_info = {v: k for k, v in zip(sort_info.keys(), sort_info.values())}
  col_1 = [r_sort_info.get(item) for item in col_1]
  df.columns = df.columns.set_levels(col_1, level=ix)

以上这篇pandas 透视表中文字段排序方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现2048小游戏
Mar 30 Python
python使用BeautifulSoup分页网页中超链接的方法
Apr 04 Python
在Python中marshal对象序列化的相关知识
Jul 01 Python
详解python 字符串和日期之间转换 StringAndDate
May 04 Python
python2.x实现人民币转大写人民币
Jun 20 Python
python实现飞机大战
Sep 11 Python
python 列表中[ ]中冒号‘:’的作用
Apr 30 Python
python word转pdf代码实例
Aug 16 Python
python计算Content-MD5并获取文件的Content-MD5值方式
Apr 03 Python
python实现学生管理系统开发
Jul 24 Python
Python性能测试工具Locust安装及使用
Dec 01 Python
详解Python模块化编程与装饰器
Jan 16 Python
用Python实现数据的透视表的方法
Nov 16 #Python
pandas pivot_table() 按日期分多列数据的方法
Nov 16 #Python
python生成以及打开json、csv和txt文件的实例
Nov 16 #Python
python判断列表的连续数字范围并分块的方法
Nov 16 #Python
Python 数值区间处理_对interval 库的快速入门详解
Nov 16 #Python
Pandas Shift函数的基础入门学习笔记
Nov 16 #Python
Python补齐字符串长度的实例
Nov 15 #Python
You might like
php支付宝在线支付接口开发教程
2016/09/19 PHP
PHP实现原生态图片上传封装类方法
2016/11/08 PHP
PHPCMS手机站伪静态设置详细教程
2017/02/06 PHP
js为鼠标添加右击事件防止默认的右击菜单弹出
2013/07/29 Javascript
jquery监听div内容的变化具体实现思路
2013/11/04 Javascript
jquery实现瀑布流效果分享
2014/03/26 Javascript
JavaScript数组方法大全(推荐)
2016/07/05 Javascript
js手动播放图片实现图片轮播效果
2016/09/17 Javascript
javascript十六进制数字和ASCII字符之间的转换方法
2016/12/27 Javascript
浅谈$_FILES数组为空的原因
2017/02/16 Javascript
node.js平台下利用cookie实现记住密码登陆(Express+Ejs+Mysql)
2017/04/26 Javascript
利用nvm管理多个版本的node.js与npm详解
2017/11/02 Javascript
Vue 仿QQ左滑删除组件功能
2018/03/12 Javascript
JavaScript反射与依赖注入实例详解
2018/05/29 Javascript
vue打包npm run build时候界面报错的解决
2020/08/13 Javascript
使用setup.py安装python包和卸载python包的方法
2013/11/27 Python
pygame学习笔记(1):矩形、圆型画图实例
2015/04/15 Python
Django实现自定义404,500页面教程
2017/03/26 Python
Python实现读取机器硬件信息的方法示例
2018/06/09 Python
python用pandas数据加载、存储与文件格式的实例
2018/12/07 Python
Python把对应格式的csv文件转换成字典类型存储脚本的方法
2019/02/12 Python
pandas实现DataFrame显示最大行列,不省略显示实例
2019/12/26 Python
Django后台管理系统的图文使用教学
2020/01/20 Python
PHP高级工程师面试问题推荐
2013/01/18 面试题
网络体系结构及协议的定义
2014/03/13 面试题
精选干货:Java精选笔试题附答案
2014/01/18 面试题
在校生钳工实习自我鉴定
2013/09/19 职场文书
毕业生机械建模求职信
2013/10/14 职场文书
信息管理专业推荐信
2013/10/29 职场文书
国家助学金获奖感言
2014/01/31 职场文书
党的群众路线教育实践活动组织生活会发言材料
2014/10/17 职场文书
2014年调度员工作总结
2014/11/19 职场文书
2015年国庆节慰问信
2015/03/23 职场文书
少先队大队委竞选口号
2015/12/25 职场文书
JavaScript展开运算符和剩余运算符的区别详解
2022/02/18 Javascript
springboot用户数据修改的详细实现
2022/04/06 Java/Android