Pandas实现DataFrame的简单运算、统计与排序
作者:Jackson_Wang 发布时间:2022-03-29 02:09:54
在前面的章节中,我们讨论了Series的计算方法与Pandas的自动对齐功能。不光是Series,DataFrame也是支持运算的,而且还是经常被使用的功能之一。
由于DataFrame的数据结构中包含了多行、多列,所以DataFrame的计算与统计可以是用行数据或者用列数据。为了更方便我们的使用,Pandas为我们提供了常用的计算与统计方法:
操作 | 方法 | 操作 | 方法 |
---|---|---|---|
求和 | sum | 最大值 | max |
求均值 | mean | 最小值 | min |
求方差 | var | 标准差 | std |
中位数 | median | 众数 | mode |
分位数 | quantile |
一.运算
接上文的例子,我们已经有了N个学生的数学、语文、英语的成绩表,现在,我们要算出每个学生的总成绩,那么我们就可以用以下的方法:
'''
行的求和以下演示两种方法:
方法1:先把待求和的列数据删选出来(剔除掉name列),然后使用sum函数求和
方法2:把待求和的列一个一个选出来然后使用运算符求和
两种方法最后的结果为像原有的DataFrame中新增一列,数据为每行数据的求和
'''
df['sum'] = df[['chinese', 'math', 'english']].sum(1)#方法1
df['sum'] = df['chinese'] + df['math'] + df['english']#方法2
Output:
name chinese english math sum
0 XiaoMing 99 100 80 279
1 LiHua 102 79 92 273
2 HanMeiNei 111 130 104 345
在sum方法中我们传入了参数1,代表的是我们使用的轴(axis)为行(对行数据进行求和),如果想要计算出每列的求和我们只用传入0即可(sum函数默认参数为0,所以也可不传):
df[['chinese', 'math', 'english']].sum(0)
Output:
chinese 312
math 276
english 309
dtype: int64
现在有了总成绩,那么数学老师或者语文老师就会关心本班学生的数据平均分是多少,同样的,我们可以非常快速的计算出来:
df['math'].mean()#方法一:直接使用Pandas提供的mean求均值方法
df['math'].sum() / df.shape[0]#方法二:使用求和方法算出总和后除以总人数(行数)
Output:
92.0
本🌰中使用了DataFrame的shape方法,这个方法是用来显示DataFrame的行数和列数的,行数为0,列数1。需要注意的是输出的列数值是不含索引列的。
上述🌰只计算了数学的平均分,感兴趣的小伙伴可以自行基础出英语和语文的平均分哦~
二.统计
这个时候数学老师又有新的需求了,他想查看本班学生数学成绩的最高分、最低分、中位数等统计数据,那么根本不慌,Pandas统统可以帮我们搞定:
df['math'].min() # math列的最小值
Output:80
df['math'].max() # math列的最大值
Output:104
df['math'].quantile([0.3, 0.4, 0.5]) # math列的30%、40%、50%分位数
Output:
0.3 87.2
0.4 89.6
0.5 92.0
Name: math, dtype: float64
df['math'].std() # math列的标准差
Output:12
df['math'].var() # math列的方差
Output:144
df['math'].mean() # math列的平均数
Output:92
df['math'].median() # math列的中位数
Output:92
df['math'].mode() # math列的众数,返回一个Series对象(有可能出现并列的情况,例子中众数为1,所以都返回)
Output:
0 80
1 92
2 104
dtype: int64
我们也可以使用DataFrame的describe方法对DataFrame查看基本的统计情况:
df.describe()
Outprint:
chinese english math sum
count 3.000000 3.000000 3.0 3.000000
mean 104.000000 103.000000 92.0 299.000000
std 6.244998 25.632011 12.0 39.949969
min 99.000000 79.000000 80.0 273.000000
25% 100.500000 89.500000 86.0 276.000000
50% 102.000000 100.000000 92.0 279.000000
75% 106.500000 115.000000 98.0 312.000000
max 111.000000 130.000000 104.0 345.000000
三.排序
一般来讲我们的成绩表都是按照总分从高到低进行排序:
df = df.sort_values(by='sum', ascending=False)
Output:
name chinese english math sum
2 HanMeiNei 111 130 104 345
0 XiaoMing 99 100 80 279
1 LiHua 102 79 92 273
可以看到我们使用了sort_values方法对DataFrame进行排序,同时by参数传入‘sum’指定按照‘sum’字段进行排序,ascending用来设置是降序(False)还是升序(True,默认值)排序。使用sort_values排序后默认会返回一个新的DataFrame对象,也就是说并不会影响原有的DataFrame对象,所以例子中我们才会把排序后的对象赋值给原有的DataFrame对象,如果不想排序后创建新的对象也是可以的,只需要传入inplace=True即可(在原有的DataFrame基础上修改):
df.sort_values(by='sum', ascending=False, inplace=True)
print(df)
Output:
name chinese english math sum
2 HanMeiNei 111 130 104 345
0 XiaoMing 99 100 80 279
1 LiHua 102 79 92 273
细心的小伙伴可能会发现当我们进行排序后,如果DataFrame中的行数据有调整的话,其行的索引值是不会更改的,上述例子中因为我们用了默认的递增数列索引,所以排序后看起来并不是很友好,不过不用担心,我们还是可以重置索引值的:
df = df.sort_values(by='sum', ascending=False).reset_index()
Output:
index name chinese english math sum
0 2 HanMeiNei 111 130 104 345
1 0 XiaoMing 99 100 80 279
2 1 LiHua 102 79 92 273
使用reset_index重设索引后我们的DataFrame对象的索引列确实被重置成了递增的序列,同时也多了列名为index的一列数据。当然我们可以传入drop=True将原有的索引列不插入到新的DataFrame中:
df = df.sort_values(by='sum', ascending=False).reset_index(drop=True)
name chinese english math sum
0 HanMeiNei 111 130 104 345
1 XiaoMing 99 100 80 279
2 LiHua 102 79 92 273
为了更直观的展示排名情况,我们可以索引值+1这样就展示出了学生的排名情况:
df.index += 1
name chinese english math sum
1 HanMeiNei 111 130 104 345
2 XiaoMing 99 100 80 279
3 LiHua 102 79 92 273
来源:https://juejin.cn/post/6933840539666087950
猜你喜欢
- python中有一个略微奇怪的表达式叫yield expression,本文就来探究一下这是个什么东西。一步一步来。iterablemyli
- 本文假设你在 GitHub 上已经有一个想要打包和发布的项目。第 0 步:获取项目许可证在做其他事之前,由于你的项目要开源,因此应该有一个许
- 实验环境:windows 7,anaconda 3(Python 3.5),tensorflow(gpu/cpu)函数介绍:标准化处理可以使
- PHP输出JSON格式数据常用框架封装好的方法来输出JSON数据,但是手动去书写的时候却遇到了问题,因为输出的数据类型为字符串类型,导致不能
- 在使用Tensor时,我们首先要掌握如何使用Tensor来定义不同数据类型的变量。Tensor时张量
- 最近看《python核心编程》,书中实现了一个简单的1对1的TCPserver,但是在实际使用中1对1的形势明显是不行的,所以研
- 根据“廖雪峰”的教程进行python学习,计划每天抽出1-2个小时的时间进行充电。Python是著名的“龟叔”Guido van Rossu
- CSS是制作网页效果必不可少的东西,字体的颜色定义、表格的样式定义、图片的特效等等都少不了它。但在Dr
- 脚本运行环境python 3.6+edge浏览器(推荐使用,因为在edge浏览器中可以获得额外12分,当然chrome浏览器也可以)webd
- 详解:箱型图提供了识别异常值的一个标准:异常值通常被定义为小于QL-1.5IQR或大于QU+1.5IQR的值。QL称为下四分位数,表示全部观
- 🚩 前言本次实现了一个在浏览器中运行的简陋的人脸检测功能,由于水平有限,这里使用表单上传图片,只能一次检测一张人脸。实现过程中遇到的主要问题
- 平常我们只听说过ADO等一类ASP对象,但在ASP中还有个鲜为人知的专门SQL Server的ASP访问对象,它就是SQLOLE.SQLSe
- 首先,需要获取任意知乎的问题,只需要你输入问题的ID,就可以获取相关的页面信息,比如最重要的合计有多少人回答问题。问题ID为如下标红数字编写
- 数据集介绍《悲惨世界》中的人物关系图,图中共77个节点、254条边。数据集截图:打开README文件:Les Misérables netw
- 最近在Ubuntu16.04上安装Python3.6之后,使用pip命令出现了问题,提示说找不到ssl模块,出现错误如下:pip is co
- Golang与python线程详解及简单实例在GO中,开启15个线程,每个线程把全局变量遍历增加100000次,因此预测结果是 15*100
- 日常我们见的多的水印大都是做到图片里的,我依据html元素的css position定位作出这个 * 印,供大家参考<!DOCTYPE
- Object 类型的对象虽然有 toString 方法,但结果却是 [Object Object] 让人没法理解的字符。比如简单的对象:{n
- 1.字典的概念字典和列表类似,也是可变序列,不过和列表不同,它是无序的可变序列,保存的内容是以键值对(key:value)形式存放的 字典的
- # -*- coding: UTF-8 -*-from __future__ import unicode_literalsimport I