Pandas转pivot, groupby等结果为dataFrame--彻底解决多表头问题
Pandas转pivot, groupby等结果为dataFrame
问题背景:
在用Pandas进行数据分析和处理的时候,常会用到如goupby(),pivot()
等方法,这些方法极大简化了我们的操作复杂度。但另一方面,这些操作之后返回的类型往往却并不是一个标准的DataFrame
。具体的现象就是常会出现多出来的一级表头,而当我们想要再进行继续处理时,它的索引方式就发生变化了,不便于我们进一步操作。因此我们希望能够有一种方法将这些返回类型再次变为我们需要的DataFrame
类型同时保持原有的表头。本文就这一问题进行简单描述。
给定数据(借用一下这位朋友的数据):
import pandas as pd
df= pd.DataFrame({'name': ['张三','李四','王五','张三','王五','张三','赵六','张三','赵六'],'sex': ['男','女','男','男','男','男','女','女','女'],'expense': [2.9,9.0,8.5,5.6,5.6,5.2,1.2,4.5,3.2],'income': [5.2,2.5,6.3,5.6,4.5,5.6,1.2,8.5,1.2]})
df
的值
dfname sex expense income
0 张三 男 2.9 5.2
1 李四 女 9.0 2.5
2 王五 男 8.5 6.3
3 张三 男 5.6 5.6
4 王五 男 5.6 4.5
5 张三 男 5.2 5.6
6 赵六 女 1.2 1.2
7 张三 女 4.5 8.5
8 赵六 女 3.2 1.2
现在按性别统计他们的开销:
df_expense = df.groupby(['sex','name'])['expense'].agg(np.mean)
结果:
df_expensesex name
女 张三 4.500000李四 9.000000赵六 2.200000
男 张三 4.566667王五 7.050000
Name: expense, dtype: float64
注意,此时的df_expense
变成了series
,因为这里我们只聚合了一列。而此时的前2列,实际上已经变成了df_expense
的index
df_expense.indexMultiIndex([('女', '张三'),('女', '李四'),('女', '赵六'),('男', '张三'),('男', '王五')],names=['sex', 'name'])
那么如果直接使用to_frame()
方法则不能得到我们想要的结果(即sex,name,mean_expense
各为一列):
pd.DataFrame(df_expense)expense
sex name
女 张三 4.500000李四 9.000000赵六 2.200000
男 张三 4.566667王五 7.050000
因为此时它的index
仍然是刚才那个Series
类型的index
。
还好Pandas
实际上提供了一种机制,即重置索引。其基本原理是将每一列只要是表头的项全部放在一起,作为一个完整的表头名,从而实现将多级表头合并为同一个表头的效果:
df_new = pd.DataFrame(df_expense).reset_index()df_newsex name expense
0 女 张三 4.500000
1 女 李四 9.000000
2 女 赵六 2.200000
3 男 张三 4.566667
4 男 王五 7.050000
再检查一下它的表头现在是哪些:
df_new.columnsIndex(['sex', 'name', 'expense'], dtype='object')
这样一来,df_new
就又变回了我们想要的DataFrame
类型,就方便我们操作了。
Pandas转pivot, groupby等结果为dataFrame--彻底解决多表头问题相关推荐
- python pandas库——pivot使用心得
python pandas库--pivot使用心得 2017年12月14日 17:07:06 阅读数:364 最近在做基于python的数据分析工作,引用第三方数据分析库--pandas(versio ...
- pandas中pd.groupby()的用法
在pandas中的groupby和在sql语句中的groupby有异曲同工之妙,不过也难怪,毕竟关系数据库中的存放数据的结构也是一张大表罢了,与dataframe的形式相似. import numpy ...
- pandas之分组groupby()的使用整理与总结
文章目录 前言 准备 基本操作 可视化操作 REF 前言 在使用pandas的时候,有些场景需要对数据内部进行分组处理,如一组全校学生成绩的数据,我们想通过班级进行分组,或者再对班级分组后的性别进行分 ...
- pandas使用extract函数根据正则表达式从dataframe指定数据列的字符串中抽取出数字并生成新的数据列(extract numbers from column)
pandas使用extract函数根据正则表达式从dataframe指定数据列的字符串中抽取出数字并生成新的数据列(extract numbers from column and generate n ...
- pandas使用np.where函数计算返回dataframe中指定数据列包含缺失值的行索引列表list
pandas使用np.where函数计算返回dataframe中指定数据列包含缺失值的行索引列表list(index of rows with missing values in dataframe ...
- pandas使用iteritems函数迭代地查看dataframe中的每个数据列(iterate over each column of a dataframe)
pandas使用iteritems函数迭代地查看dataframe中的每个数据列(iterate over each column of a dataframe) 目录 pandas使用iterite ...
- pandas创建内容全是0的dataframe、pandas基于随机整数、随机浮点数创建dataframe(random numbers)
pandas创建内容全是0的dataframe.pandas基于随机整数.随机浮点数创建dataframe(random numbers) 目录 pandas创建内容全是0的dataframe.pan ...
- pandas使用rename函数自定义重命名dataframe指定索引标签(位置)的名称(customize rename index value or label)
pandas使用rename函数自定义重命名dataframe指定索引标签(位置)的名称(customize rename index value or label) 目录
- pandas使用loc函数更新、修改dataframe指定数据行的内容(update or change the content of specific row of dataframe)
pandas使用loc函数更新.修改dataframe指定数据行的内容(update or change the content of specific row of dataframe) 目录
最新文章
- node.js搭建简单服务器,用于前端测试websocket链接方法和性能测试
- 强烈推荐Bulletproof Ajax 中文版
- MYSQL专题-绝对实用的MYSQL优化总结
- java字段不序列化注解_@Transient注解的使用(不被序列化和作为临时变量存储)...
- Linux常用命令 -- screen
- python 获取向上两级路径_Python学习第171课--相对路径和绝对路径
- Linux(ubuntu)下切换root用户
- Nginx源码分析 - 基础数据结构篇 - hash表结构 ngx_hash.c(07)
- cad插件_CAD排版插件(附下载)
- 网络操作系统和分布式系统区别简介
- 洛谷【入门4】数组 P2141 [NOIP2014 普及组] 珠心算测验
- StudentManagerSystem(学生管理系统)(利用Result类,各种工具类)
- Unity3D实现3D立体游戏原理及过程,需偏振眼镜3D显
- .NET反编译工具Reflector及插件
- 互联网如何再定义古老的眼镜行业?
- 未来汽车是什么样?取消后视镜的车型将于2019年面世 | 行业
- C/C++_atoi,itoa功能及其实现原理
- Buildroot 制作根文件系统
- or计算遇到存在零“0”的情况
- 23/09/2022 c语言细节
热门文章
- louvian算法 缺点 优化_机器学习中的优化算法(1)-优化算法重要性,SGD,Momentum(附Python示例)...
- Win服务器2008和2012哪个更好?
- ios 中ARC与非ARC的转换
- Unity 字典实现
- 测开之路二十:比较v1和v2
- java之IO流(commons-IO)
- bootstrap 源码中部分不了解的css属性
- nginx 重写 隐藏index.php
- python之列表推导式 内置函数
- H5嵌入原生开发小结----兼容安卓与ios的填坑之路