Pandas实现DataFrame的简单运算、统计与排序


Posted in Python onMarch 31, 2022

在前面的章节中,我们讨论了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

到此这篇关于Pandas实现DataFrame的简单运算、统计与排序的文章就介绍到这了,更多相关Pandas DataFrame运算统计与排序内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python中DJANGO简单测试实例
May 11 Python
Django中使用celery完成异步任务的示例代码
Jan 23 Python
Python实现的绘制三维双螺旋线图形功能示例
Jun 23 Python
numpy 对矩阵中Nan的处理:采用平均值的方法
Oct 30 Python
PyQt5 窗口切换与自定义对话框的实例
Jun 20 Python
Django的models中on_delete参数详解
Jul 16 Python
Python一键查找iOS项目中未使用的图片、音频、视频资源
Aug 12 Python
Tensorflow读取并输出已保存模型的权重数值方式
Jan 04 Python
python3格式化字符串 f-string的高级用法(推荐)
Mar 04 Python
python实现图片横向和纵向拼接
Mar 05 Python
python3 中时间戳、时间、日期的转换和加减操作
Jul 14 Python
详解如何在PyCharm控制台中输出彩色文字和背景
Aug 17 Python
Pandas数据结构之Series的使用
Mar 31 #Python
python获取字符串中的email
Mar 31 #Python
Python利用FlashText算法实现替换字符串
详解Python flask的前后端交互
Mar 31 #Python
ubuntu安装jupyter并设置远程访问的实现
Python中time与datetime模块使用方法详解
Mar 31 #Python
Python用tkinter实现自定义记事本的方法详解
Mar 31 #Python
You might like
六酷社区论坛HOME页清新格调免费版 下载
2007/03/07 PHP
PHP使用CURL_MULTI实现多线程采集的例子
2014/07/29 PHP
PHP yii实现model添加默认值的方法(两种方法)
2016/11/10 PHP
PHP实现查询手机归属地的方法详解
2017/04/28 PHP
php判断电子邮件是否正确方法
2018/12/04 PHP
PHP随机生成中文段落示例【测试网站内容时使用】
2020/04/26 PHP
编写针对IE的JS代码两种编写方法
2013/01/30 Javascript
javascript break指定标签打破多层循环示例
2014/01/20 Javascript
jquery获取当前点击对象的value方法
2014/02/28 Javascript
基于JQuery制作可编辑的表格特效
2014/12/23 Javascript
JS+HTML5手机开发之滚动和惯性缓动实现方法分析
2016/06/12 Javascript
基于JQuery的购物车添加删除以及结算功能示例
2017/03/08 Javascript
layui框架中layer父子页面交互的方法分析
2017/11/15 Javascript
Vue.js在数组中插入重复数据的实现代码
2017/11/17 Javascript
JavaScript实现多叉树的递归遍历和非递归遍历算法操作示例
2018/02/08 Javascript
浅谈Webpack核心模块tapable解析
2018/09/11 Javascript
搭建基于express框架运行环境的方法步骤
2018/11/15 Javascript
在vue中使用echarts(折线图的demo,markline用法)
2020/07/20 Javascript
解决vue.js中settimeout遇到的问题(时间参数短效果不稳定)
2020/07/21 Javascript
js基于canvas实现时钟组件
2021/02/07 Javascript
python中将正则过滤的内容输出写入到文件中的实例
2018/10/21 Python
对python中的argv和argc使用详解
2018/12/15 Python
centos6.5安装python3.7.1之后无法使用pip的解决方案
2019/02/14 Python
搞定这套Python爬虫面试题(面试会so easy)
2019/04/03 Python
使用python画社交网络图实例代码
2019/07/10 Python
如何爬取通过ajax加载数据的网站
2019/08/15 Python
Anaconda之conda常用命令介绍(安装、更新、删除)
2019/10/06 Python
Opencv常见图像格式Data Type及代码实例
2020/11/02 Python
意大利体育用品网上商城:Nencini Sport
2016/08/18 全球购物
英格兰橄榄球商店:England Rugby Store
2016/12/17 全球购物
Vivo俄罗斯官方在线商店:中国智能手机品牌
2019/10/04 全球购物
锐步香港官方网上商店:Reebok香港
2020/11/05 全球购物
教师求职自荐信
2014/03/09 职场文书
学生会主席演讲稿
2014/04/25 职场文书
风之谷观后感
2015/06/11 职场文书
百年孤独读书笔记
2015/06/29 职场文书