Python数据分析pandas之分组统计透视表
Python数据分析pandas之分组统计透视表
数据聚合统计
Padans里的聚合统计即是应用分组的方法对数据框进行聚合统计,常见的有min(最小)、max(最大)、avg(平均值)、sum(求和)、var()、std(标准差)、百分位数、中位数等。
数据框概览
可以通过describe方法查看当前数据框里数值型的统计信息,主要包括条数、均值、标准差、最小值、25分位数、50分位数、75分位数、最大值方面的信息。
如果是查看某列的统计信息,在数据框下加“.”列名即可。
import pandas as pd
df2=pd.DataFrame([["李四",32,'A',90],["王二",19,'B',78],["王三",34,'C',55],["刘七",35,'A',91]],columns=['name','age','level','score'],index=['no_001','no_002','no_003','no_006'])
#查看所有数值列数据概况
print(df2.describe())
#查看age列的数据概况
print(df2.age.describe())
# 当然也可以指定percentiles,比如这里仅显示百分之30、50分位数。
# print(df2.describe(percentiles=[0.3,0.5]))
#结果age score
count 4.000000 4.000000
mean 30.000000 78.500000
std 7.438638 16.743158
min 19.000000 55.000000
25% 28.750000 72.250000
50% 33.000000 84.000000
75% 34.250000 90.250000
max 35.000000 91.000000
count 4.000000
mean 30.000000
std 7.438638
min 19.000000
25% 28.750000
50% 33.000000
75% 34.250000
max 35.000000
Name: age, dtype: float64
单独查看统计信息
import pandas as pd
df2=pd.DataFrame([["李四",32,'A',90],["王二",19,'B',78],["王三",34,'C',55],["刘七",35,'A',91]],columns=['name','age','level','score'],index=['no_001','no_002','no_003','no_006'])
#查看所有数值列数据详情,分开统计
print(df2.age.count(),df2.age.mean(),df2.age.std(),df2.age.min(),df2.age.quantile(0.25),df2.age.quantile(0.5),df2.age.quantile(0.75),df2.age.sum())
#结果
4 30.0 7.438637868140466 19 28.75 33.0 34.25 120
按照某一列分组统计
#这里按照等级列进行分组,以求最大值为例,其它的聚合函数类似。import pandas as pd df2=pd.DataFrame([["李四",32,'A',90],["王二",19,'B',78],["王三",34,'C',55],["刘七",35,'A',91],["麻六",34,'A',83]],columns=['name','age','level','score'],index=['no_001','no_002','no_003','no_004','no_005'])
#查看等级列的聚合(最大值)情况
print(df2.groupby('level').max())
#结果
name age score
level
A 麻六 35 91
B 王二 19 78
C 王三 34 55
按照多列分组统计
多列(两列以上)分组统计,当前以等级、排名列为例,聚合函数是最大值(max)。
import pandas as pd df2=pd.DataFrame([["李四",32,'A',90,2,1500,300],["王二",19,'B',78,2,1300,200],["王三",34,'C',55,1,1250,235],["刘七",35,'A',91,3,1000,100],["麻六",34,'A',83,3,900,400]],columns=['name','age','level','score','rn','income','bouns'],index=['no_001','no_002','no_003','no_004','no_005']) # 按照默认列分组取最大值
#print(df2.groupby(['level','rn']).max())
##指定列(age)分组取最大值 print(df2.groupby(['level','rn']).age.max()) #print(df2.groupby(['level','rn'])['age'].max())#等同于上式
#结果name age score income bouns level rn A 2 李四 32 90 1500 300 3 麻六 35 91 1000 400 B 2 王二 19 78 1300 200 C 1 王三 34 55 1250 235
level rn
A 2 32 3 35
B 2 19
C 1 34
Name: age, dtype: int64
分组统计结合APPLY
通过APPLY结合lambda表达式生成新列,生成的对象是Series,如有需要可以转换为DataFrame。
import pandas as pd
df2=pd.DataFrame([["李四",32,'A',90,2,1500,300],["王二",19,'B',78,2,1300,200],["王三",34,'C',55,1,1250,235],["刘七",35,'A',91,3,1000,100],["麻六",34,'A',83,3,900,400]],columns=['name','age','level','score','rn','income','bouns'],index=['no_001','no_002','no_003','no_004','no_005'])
#通过APPLY结合lambda表达式生成新列
df_apply = pd.DataFrame(df2.groupby(['level', 'rn'], as_index=False).apply(lambda x: sum(x['income'])/sum(x['income']+x['bouns'])),columns=['rate'])
df_fin= df_apply.reset_index()
print(df_fin)
#结果,这里level和rn是索引。rate
level rn
A 2 0.833333 3 0.791667
B 2 0.866667
C 1 0.841751
分组统计结合APPLY与索引重建
通过APPLY结合lambda表达式生成新列,生成的对象是Series,因为groupby里的分组字段会转为索引,要变为列,需要通过reset_index方法。
import pandas as pd
df2=pd.DataFrame([["李四",32,'A',90,2,1500,300],["王二",19,'B',78,2,1300,200],["王三",34,'C',55,1,1250,235],["刘七",35,'A',91,3,1000,100],["麻六",34,'A',83,3,900,400]],columns=['name','age','level','score','rn','income','bouns'],index=['no_001','no_002','no_003','no_004','no_005'])
#通过APPLY结合lambda表达式生成新列
df_apply = pd.DataFrame(df2.groupby(['level', 'rn'], as_index=False).apply(lambda x: sum(x['income'])/sum(x['income']+x['bouns'])),columns=['rate'])
df_fin= df_apply.reset_index()
print(df_fin)
#结果level rn rate
0 A 2 0.833333
1 A 3 0.791667
2 B 2 0.866667
3 C 1 0.841751
透视表pivot_table
通过pivot_table实现以姓名(name)为索引,不同级别最小值(min)、收入(income)总和为列的交叉表。
import pandas as pd df2=pd.DataFrame([["李四",32,'A',90,2,1500,300],["王二",19,'B',78,2,1300,200],["王三",34,'C',55,1,1250,235],["刘七",35,'A',91,3,1000,100],["麻六",34,'A',83,3,900,400]],columns=['name','age','level','score','rn','income','bouns'],index=['no_001','no_002','no_003','no_004','no_005']) print(df2.pivot_table(index='name',columns=["level"],aggfunc={'age':max,'income':sum}))
#结果age income level A B C A B C
name
刘七 35.0 NaN NaN 1000.0 NaN NaN
李四 32.0 NaN NaN 1500.0 NaN NaN
王三 NaN NaN 34.0 NaN NaN 1250.0
王二 NaN 19.0 NaN NaN 1300.0 NaN
麻六 34.0 NaN NaN 900.0 NaN NaN
Python数据分析pandas之分组统计透视表相关推荐
- Python数据分析——Pandas基础:dt.datetime与pivot_table()数据透视表
系列文章目录 Chapter 1:创建与探索DF.排序.子集化:Python数据分析--Pandas基础入门+代码(一) Chapter 2:聚合函数,groupby,统计分析:Python数据分析- ...
- Python数据分析小技巧:如何在Pandas中实现数据透视表?
Python数据分析小技巧:如何在Pandas中实现数据透视表? 数据透视表是数据分析中非常有用的工具,可以帮助我们快速了解数据的结构.关联和趋势.在Pandas中,我们可以使用pivot_table ...
- pandas数据处理实践五(透视表pivot_table、分组和透视表实战Grouper和pivot_table)
建议大家多研究pandas的官方文档 透视表: DataFrame.pivot_table(values = None,index = None,columns = None,aggfunc ='me ...
- 利用excel与Pandas完成实现数据透视表(文末赠书)
文末赠书 数据透视表是一种分类汇总数据的方法.本文章将会介绍如何用Pandas完成数据透视表的制作和常用操作. 1,制作数据透视表 制作数据透视表的时候,要确定这几个部分:行字段.列字段.数 ...
- 利用excel与Pandas完成实现数据透视表
数据透视表是一种分类汇总数据的方法.本文章将会介绍如何用Pandas完成数据透视表的制作和常用操作. 1,制作数据透视表 制作数据透视表的时候,要确定这几个部分:行字段.列字段.数据区,汇总函数.数据 ...
- Python数据分析pandas之数据拼接与连接
Python数据分析pandas之数据拼接与连接 数据拼接处理 数据拼接处理指的是numpy.pandas里对数据的拼接.连接.合并等多种方法的概称.有时我们处理的数据会分很多步骤,而中间或者最终的结 ...
- Python数据分析pandas之dataframe初识
Python数据分析pandas之dataframe初识 声明与简介 pandas是一个基于python的.快速的.高效.灵活.易用的开源的数据处理.分析包(工具)..pandas构建在numpy之上 ...
- Python数据分析pandas之多层高维索引
Python数据分析pandas之多层高维索引 DataFrame多层索引 多层索引简介 众所周知Pandas的Series和DataFrame存放的是一维和二维数组,那么想存放多维数组就得通过多层索 ...
- Python数据分析pandas之series初识
Python数据分析pandas之series初识 声明与简介 pandas是一个基于python的.快速的.高效.灵活.易用的开源的数据处理.分析包(工具)..pandas构建在numpy之上,它通 ...
最新文章
- okhttp面试: Socket
- 面试官:Java中 serialVersionUID 的作用是什么?举个例子说明
- JSON数据的HTTP Header应该怎么标记?
- RabbitMQ的安装(linux篇)
- 阿里云面试官:如果是MySQL引起的CPU消耗过大,你会如何优化?
- NASA宣布发现 “第2个地球”
- jvm类加载器以及双亲委派
- eclipse安装web插件、安装centos版本的idea
- java线程交替执行_Java synchronized线程交替运行实现过程详解
- Android开发学习笔记:浅谈ToggleButton
- YII2框架 Gii生成CURD 的问题
- HDU2024 C语言合法标识符【入门】
- Nginx做反向代理的问题
- this关键字在构建错误实例时使用说明
- 大自然的印钞机农夫山泉是如何干过一群互联网与电商大佬的
- 友元函数实现复数加减法
- 如何查找重复文件并快速删除,电脑查重复文件的方法
- python 创建目录时间_python实现根据当前时间创建目录并输出日志
- HashMap、HashTable和ConcurrentHashMap的区别?
- linux date -s日期时间,linux下的date详解
热门文章
- Java 堆内存优化
- JavaScript实现最小公倍数LCM算法(附完整源码)
- OpenCASCADE绘制测试线束:图形命令之Axonometric观察器
- OpenCASCADE:建立Body
- wxWidgets:wxScrollBar类用法
- boost::spirit模块实现自定义用作容器数据的测试程序
- boost::process::async_pipe相关的测试程序
- boost::interprocess::anonymous_shared_memory用法的测试程序
- boost::gil::channel_traits用法的测试程序
- boost::fibers::launch::post的测试程序