分组聚合与数据可视化

  • 一、分组聚合
    • 1.1、单层分组聚合:df.groupby(by)['列索引'].mean()。
      • 1.1.1单层分组:df.groupby(by)
      • 1.1.2聚合操作:['列索引'].mean()
    • 1.2、 多层分组聚合:df.groupby(by)['列索引'].mean()。
  • 二、数据可视化
    • 2.1绘制单条折线图:s.plot()
      • 2.1.1为 matplotlib 库添加中文字体
      • 2.1.2 绘图
    • 2.2绘制多条折线图:df.plot()
    • 2.3绘制其它类型图
      • 2.3.1饼图
      • 2.3.2条形图

一、分组聚合

1.1分组聚合操作的定义
分组聚合操作指的是按照某项规则对数据进行分组,接着对分完组的数据执行总结性统计的操作(比如求和、求均值)。根据其分组方式的不同可以分为单层分组聚合操作以及多层分组聚合操作。

1.1、单层分组聚合:df.groupby(by)[‘列索引’].mean()。

单层分组聚合操作指的是针对某一个组进行聚合操作。

In [ 3 ]
1 # 创建DataFrame对象
2 grade_df = pd.DataFrame({'班级': [1, 1, 1, 1, 1, 2, 2, 2, 2, 2],
3'性别': ['男', '男', '女', '女', '女', '男', '男',   '男', '女', '女'],
4'眼镜': ['是', '否', '是', '否', '是', '是', '是', '否', '否', '否'],
5'成绩': [95, 90, 96, 92, 94, 85, 87, 80, 81, 86]})
6 # 查看grade_df
7 grade_dfOut [ 3 ]班级   性别  眼镜  成绩
0   1   男       是       95
1   1   男       否      90
2   1   女       是       96
3   1   女       否       92
4   1   女       是       94
5   2   男       是       85
6   2   男       是       87
7   2   男       否       80
8   2   女       否       81
9   2   女       否       86

grade-- [ɡreɪd] --等级、 mean-- [miːn]–v.意思是,n.中间,adj.小气的
group–[ɡruːp]–组、by–[baɪ]–通过;经过
例:

In [ 5 ]
1 # 对班级进行分组聚合操作,求平均值。
2 grade_df1 = grade_df.groupby('班级')['成绩'].mean()
3 # 查看grade_df1
4 grade_df1Out [ 5 ]
班级
1    93.4
2    83.8
Name: 成绩, dtype: float64

分组聚合操作返回的是一个 Series 对象, 但它的索引会多一个名字,如上面的班级因为是对班级这一列进行分组的。

1.1.1单层分组:df.groupby(by)

参数 by: 要对哪一列数据进行分组操作,就把列名传给参数,如:‘班级’
单层分组操作只能根据一列数据进行分组。

1.1.2聚合操作:[‘列索引’].mean()

‘列索引’指的是需要对哪一列数据进行聚合操作,如要对成绩这一列数据进行聚合操作,就可以将’成绩’传给’列索引’
mean() 指求平均值
聚合操作的其它参数:
sum-- [sʌm] --总和

中位数: 当我们对一组数据从小到大排列以后,处于中间位置的数就是中位数。

分组聚合效果图如下:

1.2、 多层分组聚合:df.groupby(by)[‘列索引’].mean()。

例:grade_df3 = grade_df.groupby([‘班级’, ‘性别’])[‘成绩’].mean()

多层分组聚合和单层分组聚合相比,代码是相同的
多层分组聚合操作返回的也是一个 Series 对象,唯一的不同点在于索引的层数上。
而多层分组聚合操作的索引至少有两层。
这些列索引在传进参数 by 之前,需要先被放进一个“容器”里,这个容器可以是列表。
分组的顺序和列表中的参数是对应的(从左往右依次拆分)。

In [ 15 ]
1 # 获取不同班级下不同性别的学生的平均分
2 grade_df3 = grade_df.groupby(['班级', '性别'])['成绩'].mean()
3 # 查看grade_df3
4 grade_df3
运行
Out [ 15 ]
班级  性别
1   女     94.0男     92.5
2   女     83.5男     84.0
Name: 成绩, dtype: float64

如:想要在原先分组的基础上,再对’眼镜’这一列进行拆分,看看尖子生是不是更容易出现在戴眼镜的学生群体中:

运行后的结果:


所有的组别信息都扎堆出现在了一个 Series 对象的索引中,看起来有点儿乱。
而通过s.unstack() 函数,可以将一个多层分组聚合后的 Series 对象转变成 DataFrame 对象。s.unstack() 这个方法是针对多层分组聚合后的 Series 对象来使用的。

unstack--解开、us--[ˌjuː ˈen] 、stack--[stæk] --堆栈


s.unstack() 函数的作用就是将其索引的最后一列转变成 DataFrame 对象的列索引,而剩下的索引则转变成 DataFrame 对象的行索引。

或者:grade_df6 = grade_df.groupby([‘班级’, ‘性别’, ‘眼镜’,])[‘成绩’].mean().unstack()

二、数据可视化

2.1绘制单条折线图:s.plot()

pandas 库是根据一个更加底层的绘图库——matplotlib,封装而来,如图形中须支持中文,要想让 pandas 库能够支持中文字体,需要先让 matplotlib 库能够支持中文字体。

2.1.1为 matplotlib 库添加中文字体

mat-- [mæt]–垫子、plot–[plɒt] --情节、lib-- [lɪb]
例:

# 导入matplotlib库的pyplot模块
from matplotlib import pyplot as plt
# 设置中文字体
plt.rcParams['font.family'] = ['要设置的字体']

plt.rcParams[‘font.family’] 可以获取 matplotlib 库中的字体
需要导入什么字体, 见下表Windows 和 Mac OS 系统下的常用中文字体。

2.1.2 绘图

绘制单条折线图的函数是:s.plot()
s.plot()常用参数见下表:

其中参数 kind 指的是图表类型。如果我们要绘制折线图,可以将 ‘line’ 传递给参数 kind。
代码示例:

kind--  [kaɪnd] --  种类;同类的人(或事物)、  line-- [laɪn]--线;线条;界线title--[ˈtaɪtl]--标题
# 创建李健的数据
li_jian = pd.Series([80, 85, 89, 91, 88, 95],index=['2月', '3月', '4月', '5月', '6月', '7月'])# 绘制单条折线图
li_jian.plot(kind='line', figsize=(6, 7), title='李健月考成绩')

参数 figsize=(6,7)为代表图像宽和高的一个元组,前面6为宽,后面7为高,单位是英寸。

2.2绘制多条折线图:df.plot()

多条折线图是针对一个 DataFrame 对象来绘制的,而单条折线图是针对一个 Series 对象来绘制的。df.plot() 默认会将每一列数据用 s.plot() 绘制成单条折线图,然后合并到同一张图上。
s.plot() 和df.plot()的参数都是可以通用的,效果也相同。
代码示例:

In [ 46 ]
1 # 创建三位学生成绩的df
2 students_grade = pd.DataFrame({'李健': [80, 85, 89, 91, 88, 95],
3'王聪': [95, 92, 90, 85, 75, 80],
4'过凡': [90, 91, 92, 91, 90, 91]
5}, index=['2月', '3月', '4月', '5月', '6月', '7月'])
6
# 绘制多条折线图
7 students_grade.plot(kind='line', figsize=(7, 7), title='月考成绩')

Out [ 46 ]
AxesSubplot:title={‘center’:‘月考成绩’}

还可以通过调用Series和DF的属性与方法,取出行和列来设置X、Y轴坐标来绘图,如:
x = s.index #查看索引 y=s.values #查看数值
x = df.index y=df.values #查看数值
绘图详细教程见
数据分析之数据展现—用matplotlib 库绘制图形

2.3绘制其它类型图

2.3.1饼图

代码示例:

# 导入数据
my_data = pd.read_csv('./工作/clean_data.csv', encoding='utf-8')
# 获取行业的频率分布
profession = my_data['行业'].value_counts()/my_data['行业'].value_counts().sum()
# 绘制行业频率分布的饼图
profession.plot(kind='pie', autopct='%.2f%%', figsize=(7, 7), title='行业频率分布图', label='')

2.3.2条形图

代码示例:

# 获取岗位的频率分布
position = my_data['岗位'].value_counts()/my_data['岗位'].value_counts().sum()
# 绘制岗位的频率分布条形图
position.plot(kind='bar', figsize=(13, 6), title='岗位频率分布条形图')

数据分析三、pandas库 分组聚合与数据可视化相关推荐

  1. stream 多个字段分组_Python Pandas对Excel数据的分组聚合和数据透视

    使用Excel进行商业数据分析的时候,最重要的就是两个手段就是vlookup函数和数据透视表.本章就讲解一下与数据透视功能相关的分组聚合和数据透视.其实分组聚合和数据透视两者基本是等价的,但由于使用的 ...

  2. Python数据分析~Pandas库30分钟快速入门

    目录 1  Pandas序列和数据表 2 Pandas数据聚合与分组运算 3 Pandas数据可视化 Pandas库在数据分析中是非常重要和常用的库,它利用数据框让数据的处理和操作变的简单和快捷.在数 ...

  3. Python数据分析之Pandas库

    Python数据分析之Pandas库 一.Pandas简介 二.Pandas库的安装 三.Pandas的数据结构 四.Series 和 DataFrame 数据结构的使用 五.其他可以参考的网站 一. ...

  4. Python pandas dataframe 分组聚合时,分组组名并入列的方法

    转载,侵删,感谢原作者 利用pandas做分组聚合时,分组组名默认是变化成index,如图 grouped = tdf.groupby('uid') mean=grouped.mean(); forw ...

  5. 用pandas批量分组处理excel数据

    用pandas批量分组处理excel数据 需求比较简单,按照指定字段分组,计算指定字段的和或均值. 用SQL处理的话就一个groupby,可是没有数据库环境,只好用python(比起SQL真的是一点也 ...

  6. pandas dataframe 分组聚合时,分组组名并入列的方法

    利用pandas做分组聚合时,分组组名默认是变化成index,如图 grouped = tdf.groupby('uid') mean=grouped.mean(); forwardmeandf=pd ...

  7. Python数据分析实战(3)Python实现数据可视化

    文章目录 一.数据可视化介绍 二.matplotlib和pandas画图 1.matplotlib简介和简单使用 2.matplotlib常见作图类型 3.使用pandas画图 4.pandas中绘图 ...

  8. 可视化框架、Axure原型、大屏可视化、图表组件、图表元件库、统计图表、数据可视化模板、条形图、折线图、散点图、时间轴、仪表盘、饼图、散点图、雷达图、高山图、登录模板、弹窗、弹幕、预警、散点图

    可视化框架.数据可视化综合管理平台.大屏可视化.图表组件.图表元件库.统计图表.数据可视化模板.条形图.折线图.散点图.时间轴.仪表盘.饼图.散点图.雷达图.高山图.登录模板.弹窗.弹幕.预警.散点图 ...

  9. python数据分析及可视化(九)pandas数据规整(分组聚合、数据透视表、时间序列、数据分析流程)

    作业 拼接多个csv文件 去除重复数据,重新索引 自动挡和手动挡数目 计算每个城市二手车数量 统计每个汽车品牌平均售价价格(不是原价) 分组与聚合 如下表所示,5行3列的表格,5种水果分别对应的名称, ...

最新文章

  1. window下实现在线预览功能
  2. Python是否具有字符串“包含”子字符串方法?
  3. 信息系统分析与设计杨选辉_信息系统分析与设计(第2版)
  4. 个人易遗忘的代码记录
  5. 常用解决方案技术一览
  6. SSM整合(2): spring 与 mybatis 整合
  7. mysql的分区技术作用_理解MySQL数据库分区管理的技术细节
  8. excel判断字符串包含另一个字符串_【前端冷知识】如何正确判断一个字符串是数值?...
  9. ClassPathScanningCandidateComponentProvider 扫描给定包及其子包的类
  10. Centos 6.4使用本地yum源
  11. 使用 WebBrowser 操作 js
  12. 国内手机产业混乱:产业一窝蜂 企业捞快钱
  13. Python-jieba分词学习及应用
  14. wpf绑定 dictionary 给定关键字不再字典中_为什么要在 JavaScript 中学习函数式编程?...
  15. Python表白代码:“ 星光月夜烟花皆归你,我也归你”(满天烟花盛开、附番外玫瑰)
  16. Ubuntu中的zip / unzip 和 rar / unrar 命令:压缩 / 解压 zip 和 rar 文件
  17. 卸载360企业版密码
  18. 上海市建筑标准规范合集
  19. 直播新红海,狼人杀火爆背后的实时语音视频技术 | 深度
  20. java入库_Java实现商品的查找、添加、出库、入库操作完整案例

热门文章

  1. win7软件兼容问题解决办法
  2. 颈椎病有哪些症状?成都顾连康复医院解析
  3. ubuntu18和win7双系统安装完成---wifi上网慢和中文输入法配置记录
  4. MODIS处理工具MRT(MODIS Reprojection Tool)安装及使用
  5. xhmtlMP基础(wap2.0开发)
  6. 10. solt 插槽
  7. 量化私募江湖录:多少家?猜猜看?
  8. java new_Java中new的用法
  9. Unity 从工具栏上拖拽生成物体
  10. Java的一个常见小错误