Anders Wang


我所认识的每个人都是榜样,都有值得我去尊敬和学习的地方。


图解axis=0/1参数的理解使用

在numpy与pandas的使用中,有个常见的参数axis,根据对axis的设定值不同就会得到截然不同的结果。对于如何正确设置axis的参数值,如果有人与我曾经一样有似懂非懂的经历,那一定是在某方面没有正确的理解作者对这个参数的定义。

为了彻底说清楚axis到底是什么,我会用手稿图结合多个详细的例子来总结。

先借用网上常见描绘的axis图:

其实这个图里的方向指示很容易误导人,包括一些网上的解释也比较模糊,只要你站在不同角度去理解就会造成理解偏差,我曾经就误解绕了进去,虽然用自己理解的方法得到的结果看似是对的,但是放到其它场景时又发现是错的,才导致似懂非懂。

首先,axis定义为轴。在一维的数组中它只有一个轴就是0轴,指的是遍历每一行(所对应的是index),而把每一行拿出来遍历后,它所呈现的操作方向是垂直向下的。当在二维数组中它就有两个轴,除了前面提到的0轴外另一个轴就是1轴,指的遍历每一列(所对应的是columns),而把每一列拿出来遍历后,它所呈现的操作方向是横向水平的。

所以简单只需记住,设定axis是为了确定要删的标签是属于index还是column:

  • axis = 0 时跨行操作,一行行,方向垂直向下。所以操作的是行标签,也就是index,遍历的操作方向是垂直向下。如果是以聚合操作(如sum、mean、apply等),指的是按照遍历的操作方向竖着,跨行操作。如果从直观上理解就是,常规形式下axis = 0是对整行操作,聚合形式下是对整列操作计算。
  • axis = 1时跨列操作,一列列,方向水平横向。所以操作的是列标签,也就是columns。如果是以聚合操作(如sum、mean、apply等),指的是按照遍历的操作方向横着,跨列操作。如果从直观上理解就是,常规形式下axis = 1是对整列操作,聚合形式下是对整行操作计算。

在用例子说明前,先定义一个初始DataFrame数据类型,也就是前面提到的二维数据结构,所以它具有0轴和1轴。

1、当axis=0时移除缺失值

本例子的目的是删除含有存在缺失值的标签索引行,这里使用dropna()方法移除缺失值,由于设置了axis=0所以对每一行进行遍历(但是它遍历的方向是垂直向下的,这就是为什么说axis=0时方向向下),如果发现任何一行中包含缺失值,那么删除该行。

操作步骤图解如下:

经过上图的图解过程后,会发现0,1,2行都包含缺失值所以都被删除。最后只剩下索引为3的这一行,也就是之前代码运行得到的正确结果。

2、当axis=1时移除缺失值

本例子的目的是删除含有存在缺失值的标签列,这里使用dropna()方法移除缺失值,由于设置了axis=1所以对每一列进行遍历(但是它遍历的方向是水平横向的,这就是为什么说axis=1时方向水平),如果发现任何一列中包含缺失值,那么删除该列。

操作步骤图解如下:

经过上图的图解过程后,会发现col3,col4两列都包含缺失值所以都被删除。最后只剩下col1,col2的这两列,也就是之前代码运行得到的正确结果。

3、使用thresh参数搭配axis参数

当遍历的每一行或列,满足大于等于thresh参数所指定数量的非缺失值(non-NA),便显示这一行或列。例:如果thresh=4,当遍历的行或列中存在大于等于4个非缺失值,即可显示,否则移除。

如下图解,当thresh=4,axis=0时,使用dropna()方法,代表遍历每一行寻找是否满足4个非缺失值,不满足就移除。最后发现只剩下索引为3的这一行满足,所以只显示该行数据。

同理,当thresh=4,axis=1时,使用dropna()方法,代表遍历每一列寻找是否满足4个非缺失值,不满足就移除。最后发现只剩下标签列为col1和col2的这两列满足,所以只显示该两列数据。

4、使用聚合操作搭配axis参数

当使用聚合操作时和平时会有些不一样,比如当axis=0时是向下跨行,axis=1时是水平跨列。

怎么理解跨行和跨例呢,看下下面的例子:

首先,计算mean、sum等批量计算的函数操作时,可以理解为属于聚合操作。如下例子,当要计算当axis=0时的sum总和操作时,从图解中可以看到,它并不是按照之前理解的那样计算每一整行的总和,而是指的是按照遍历的操作方向向下跨行计算,输出每列的总和

要计算当axis=1时的sum总和操作时,从图解中可以看到,它并不是按照之前理解的那样计算每一整列的总和,而是指的是按照遍历的操作方向水平跨列计算,输出每行的总和

所以,使用聚合操作的时候,axis = 0 就是对整列操作,axis = 1就是对整行操作,正好和常规情况相反。

最近的文章

SettingwithCopyWarning在pandas中的解决方案

我在用Pandas对数据集做处理的时候会容易被抛出SettingWithCopyWarning警告信息,我相信很多人都会对它视而不见。其实,SettingWithCopyWarning 警告不应该被忽…

Python, 技术博文详细阅读
更早的文章

pandas中set_index( )和reset_index( )以及reindex()区别

在数据分析过程中,对数据表的索引操作是经常会遇到的。尤其在pandas中常用的有几个方法如set_index() 和 reset_index() 以及 reindex() ,这几个方法看着很相近但是如…

Python, 技术博文详细阅读
comments powered by Disqus