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

标签:Pandas,DataFrame,运算,统计,排序
0
投稿

猜你喜欢

  • vue中插件和组件的区别点及用法总结

    2024-05-09 09:30:07
  • Python入门教程3. 列表基本操作【定义、运算、常用函数】 <font color=red>原创</font>

    2023-07-15 13:09:19
  • Python中的Selenium异常处理

    2021-08-28 04:15:23
  • mysql 批量更新与批量更新多条记录的不同值实现方法

    2024-01-18 22:56:18
  • 彻底弄懂CSS盒子模式之二(导航栏实例)

    2007-05-11 16:52:00
  • 利用PyCharm Profile分析异步爬虫效率详解

    2023-08-15 03:02:58
  • 浅谈PHP的$_SERVER[SERVER_NAME]

    2024-05-03 15:48:46
  • Python 实现将某一列设置为str类型

    2022-07-27 03:20:12
  • 编写Python脚本批量下载DesktopNexus壁纸的教程

    2022-05-27 01:17:38
  • Pycharm 操作Django Model的简单运用方法

    2022-05-09 14:07:15
  • 比较经典技术普及帖 以你刚才在淘宝上买了一件东西

    2022-01-19 06:59:15
  • 查看Oracle的执行计划一句话命令

    2010-07-16 13:02:00
  • Sql Server中常用的6个自定义函数分享

    2024-01-17 05:05:40
  • 数据库查询优化(主从表的设计)

    2024-01-18 16:25:52
  • python pandas 对series和dataframe的重置索引reindex方法

    2023-08-25 08:10:57
  • 一文带大家了解Go语言中的内联优化

    2024-02-19 15:47:19
  • PHP格式化显示时间date()函数代码

    2023-06-10 17:55:01
  • python中实现字符串翻转的方法

    2021-06-08 04:27:59
  • sqlserver 触发器实例代码

    2024-01-14 16:45:04
  • 数据结构-树(三):多路搜索树B树、B+树

    2024-01-27 01:21:43
  • asp之家 网络编程 m.aspxhome.com