如何理解并记忆DataFrame中的Axis参数

Posted Laurence Geng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何理解并记忆DataFrame中的Axis参数相关的知识,希望对你有一定的参考价值。

@2023/1/10的补充:

最近突然意识到,或许Axis轴向的规定完全是出于:习惯!在一个二维表格里,聚合和过滤一般是面向什么操作的?列!我们平时使用最多的求和,求均值等操作都是在列上进行的,因为列是具有相同性质的同一类型数据,SQL中大量的函数都是面向列的聚合函数,既然列是主要的轴向操作,那么就应该设为默认值,从而不必每次显式设定,既然轴向又是从0编码,不如就用初值0代表默认轴向:纵向,然后axis参数统一赋默认赋初值0,统一默认按列聚合或过滤,一切遵循默认的使用习惯,这大概是轴向(Axis)横纵规定和取值的主要原因吧。


当我们遇到有axis参数的方法时,脑子里的第一反应应该是:这个方法一定是沿着某一方向进行某种“聚合”或者“过滤”操作。在此场景下,Axis参数就是用来设定操作方向的:是垂直方向还是水平方向?(本文地址:https://blog.csdn.net/bluishglc/article/details/128433476,转载请注明出处)


为什么0是垂直方向,1是水平方向呢?我们知道DataFrame是一个二维表结构,它其实是从一维的Series拓展过来的,那么一维的Series其实是一个“列”,而不一个行,原因也很简单:列的类型是一致的,这一整个Series(列)的元素是同一类型,所以,在逻辑上,我们可以认为表是由列组成的,表的第一维度应该是垂直方向,故让0代表了第1维度,即垂直方向;让1代表第2维度,即水平方向

axis=0: 一行一行推进(沿垂直方向“聚合”或“过滤”)

axis=0axis=index时,DataFrame会沿着“垂直方向”进行“迭代”,它的操作其实是作用到一到多个行上的,所以:

  • df.sum(axis=0) 是针对每一求和;
  • df.drop(index, axis=0) 是去掉某一数据;

这里就是考察我们对axis理解的地方了,同样是axis=0,sum是按求和,而drop就变成了删除的操作,这里的关键还是要结合操作本身和axis的轴线方向一起来看。sum: 求和操作,axis=0,沿垂直方向逐行推进,所以就是:对列求和。drop:删除操作,axis=0,沿垂直方向逐行推进,所以就是:按行删除。请看下面的示例代码:

import pandas as pd

df = pd.DataFrame([[1, 1, 1, 1], [2, 2, 2, 2], [3, 3, 3, 3]], columns=["col0", "col1", "col2", "col3"], index=["row0", "row1", "row2"])
print(df)
print("------------")
# 沿垂直方向推进,操作是求和,所以结果是:按列求和
print(df.sum(axis=0))
print("------------")
# 依然是沿垂直方向推进,操作是删除,所以一旦找到名为"row0"的label,则必定是一个行,所以结果将是:按行删除
print(df.drop("row0", axis=0))

程序输出:

      col0  col1  col2  col3
row0     1     1     1     1
row1     2     2     2     2
row2     3     3     3     3
------------
col0    6
col1    6
col2    6
col3    6
dtype: int64
------------
      col0  col1  col2  col3
row1     2     2     2     2
row2     3     3     3     3

注意,如果我们把drop操作写为:df.drop("row0", axis=1),运行时会报错:"['row0'] not found in axis",原因是:在水平方向上( axis=1)找不到label为row0的列!这也从侧面反映了:DataFrame总是如实地根据轴线方向进行数据的查找和过滤。

axis=1: 一列一列推进(沿水平方向“聚合”或“过滤”)

当axis=1或axis=columns时,DataFrame会沿着“水平方向”进行,它的操作其实是作用到一到多个列上的,所以:

  • df.sum(axis=1) 是针对每一求和;
  • df.drop(col_name, axis=1) 是去掉某一数据;

此处逻辑与前面相同,再次看一下示例代码:

import pandas as pd

df = pd.DataFrame([[1, 1, 1, 1], [2, 2, 2, 2], [3, 3, 3, 3]], columns=["col0", "col1", "col2", "col3"], index=["row0", "row1", "row2"])
print(df)
print("------------")
# 沿水平方向推进,操作是求和,所以结果是:按行求和
print(df.sum(axis=1))
print("------------")
# 依然是沿水平方向推进,操作是删除,所以一旦找到名为"col0"的label,则必定是一个列,所以结果将是:按列删除
print(df.drop("col0", axis=1))

程序输出:

      col0  col1  col2  col3
row0     1     1     1     1
row1     2     2     2     2
row2     3     3     3     3
------------
row0     4
row1     8
row2    12
dtype: int64
------------
      col1  col2  col3
row0     1     1     1
row1     2     2     2
row2     3     3     3

同样的,如果我们把drop操作写为:df.drop("col0", axis=0),运行时会报错:"['col0'] not found in axis"",原因是:在垂直方向上( axis=0)找不到label为col0的行!这也从侧面反映了:DataFrame总是如实地根据轴线方向进行数据的查找和过滤。

最后,再次提醒:一般有axis参数的方法,往往都是要沿着某一方向进行“聚合”或者“过滤”操作!

以上是关于如何理解并记忆DataFrame中的Axis参数的主要内容,如果未能解决你的问题,请参考以下文章

如何理解pandas中的axis参数

改组/排列熊猫中的DataFrame

python pandas-->删除DataFrame某行或某列

Python 列表理解 - numpy 数组 [关闭]

python数据分析pandas中的DataFrame数据清洗

pandas 的DataFrame.apply()