python数据分析分组聚合操作

Posted Miraitowa°

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python数据分析分组聚合操作相关的知识,希望对你有一定的参考价值。

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

【python数据分析】分组聚合操作


前言

使用python进行数据分析的基础知识:分组聚合操作:(1)分组聚合操作;(2)数据可视化

一、分组聚合操作

分组聚合操作指的是按照某项规则对数据进行分组,接着对分完组的数据执行描述性统计的操作(比如求总和、求平均值)。

练习数据如下(示例):

import pandas as pd
grade_df = pd.DataFrame('班级': [1, 1, 1, 1, 1, 2, 2, 2, 2, 2],
                         '性别': ['男', '男', '女', '女', '女', '男', '男', '男', '女', '女'],
                         '眼镜': ['是', '否', '是', '否', '是', '是', '是', '否', '否', '否'],
                         '成绩': [95, 90, 96, 92, 94, 85, 87, 80, 81, 86])
grade_df # 查看grade_df

二、单层分组聚合操作

单层分组操作
(1)该语法的功能为:对DataFrame对象执行分组操作。其中,参数by代表了我们想要对哪一列数据进行分组操作。
(2)单层分组操作只能根据一列数据进行分组。
(3)如果要对班级进行分组,就可以将列索引’班级’传给参数 by。
(4)df.groupby(by)→df.groupby(‘班级’)
聚合操作
(1)mean()的作用是求平均值。df.groupby(by).mean()的功能是根据一列数据(代码中为’班级’列)进行分组,然后将分组结果的每列数据进行平均值的计算。
(2)对分组结果执行运算,默认会对整数或浮点数类型的数据进行运算。像’性别’、'眼镜’这两列数据的值均为字符串,默认不执行对应的操作。

grade_df2 = grade_df.groupby('性别')['成绩'].median() # 求出不同性别学生数学成绩的中位数

grade_df2 # 查看grader_df2

三、 多层分组聚合操作

多层分组聚合操作
1.利用多层分组聚合操作计算不同班级下不同性别的学生均分的过程.
2.多层分组聚合和单层分组聚合相比,代码是相同的,都是 df.groupby(by)[‘列索引’].mean().
3.代码的运行结果来看,多层分组聚合操作返回的也是一个Series对象.
4.单层分组聚合操作的索引只有一层,而多层分组聚合操作的索引至少有两层.
5.单层分组聚合操作的时候,只需要将一个列索引传给参数by,多层分组聚合操作需要传多个列索引给参数 by.
6.列索引在传进参数by之前,需要先被放进一个“容器”里,这个容器可以是列表.

多层分组聚合后的Series对象转变成DataFrame对象
1.unstack()函数就是解决这个问题的常见方法。它可以将一个多层分组聚合后的Series对象转变成 DataFrame对象.
2…unstack()这个方法是针对多层分组聚合后的Series对象来使用的.作用就是将其索引的最后一列转变成DataFrame对象的列索引,而剩下的索引则转变成DataFrame对象的行索引.
3.具体实现方式:df.unstack()
grade_df6 = grade_df.groupby([‘班级’, ‘眼镜’, ‘性别’])[‘成绩’].mean().unstack()

# 获取不同班级、不同性别、戴与不戴眼镜的学生的最高分
grade_df5 = grade_df.groupby(['班级','眼镜','性别'])['成绩'].max()

# 查看grade_df5
grade_df5 

# 组别信息都出现在一个Series对象的索引中
grade_df6 = grade_df5.unstack()
type(grade_df6)

grade_df6

四、数据可视化

数据可视化可以利用人对形状、颜色的感官敏感,有效地传递信息,帮助用户更直观地从数据中发现关系、规律、趋势,数据可视化可以将枯燥的数据变得生动。折线图是以折线的上升或下降来表示统计数量的增减变化的统计图,一般用来展现数据随时间的变化趋势。折线图从类别上来分,又可以分为单条折线图与多条折线图。

(一)单条折线图
1.绘制单条折线图的代码是:Series 对象.plot(),三个参数:kind(图标类型-字符串),figsize(图标大小-元组),title(图标标题-字符串)
2.参数设置
(1)s.plot(kind=‘line’)绘制单条折线图,kind指的是图表类型
(2)传递一个代表图像宽和高的元组figsize,单位是英寸,figsize=(10,10)
(3)传递一个字符串(名字)给参数title

(二)多条折线图
1.多条折线图的绘制方法是:DataFrame对象.plot()
2.多条折线图是针对一个DataFrame对象来绘制的,而单条折线图是针对一个Series对象来绘制的
3.DataFrame对象.plot()默认会将每一列数据用Series对象.plot()绘制成单条折线图,然后合并到同一张图

(三)饼图

profession = my_data['行业'].value_counts()/my_data['行业'].value_counts().sum()
profession.plot(kind='pie', autopct='%.2f%%', figsize=(7, 7), title='行业频率分布图', label='')

(四)条形图

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

(五)实操代码

# plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
# plt.rcParams['axes.unicode_minus']=False #用来正常显示负号

import matplotlib.pyplot as plt # 导入matplotlib库的pyplot模块
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签

# 创建李健的数据,数据保存在了下方的Series对象中
li_jian = pd.Series([80, 85, 89, 91, 88, 95],
                    index=['2月', '3月', '4月', '5月', '6月', '7月'])
# 查看li_jian
li_jian
#  绘制单条折线图
li_jian.plot(kind='line', figsize=(10, 10), title='李健月考成绩', fontsize = 10)
# 多条折线图来将这三位学生的成绩同时呈现在一张折线图上,创建三个学生成绩的df
students_grade = pd.DataFrame('李健': [80, 85, 89, 91, 88, 95],
                               '王聪': [95, 92, 90, 85, 75, 80],
                               '过凡': [90, 91, 92, 91, 90, 91]
                              , index=['2月', '3月', '4月', '5月', '6月', '7月'])

# 绘制多条折线图
students_grade.plot(kind='line', figsize=(7, 7), title='月考成绩')

总结

以上文章简单实现了Python中的分组聚合操作及数据可视化操作,如有兴趣可代码实操,文章内容为课程学习笔记,谢绝转载。

                                                                                 2021年5月9日
                                                                                  青海·西宁

以上是关于python数据分析分组聚合操作的主要内容,如果未能解决你的问题,请参考以下文章

在 Python/Pandas 中执行不同操作的多列有条件地聚合分组数据

数据分析—Pandas 中的分组聚合Groupby 高阶操作

Python分组

利用Python进行数据分析-Pandas(第六部分-数据聚合与分组运算)

100天精通Python(数据分析篇)——第64天:Pandas分组groupby函数案例

python和R对dataframe的分组聚合操作:dplyrgroupbyagggroup_bynuniquereset_indexrenamesummarisen_distinct