如何理解并记忆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=0
或axis=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参数的主要内容,如果未能解决你的问题,请参考以下文章
python pandas-->删除DataFrame某行或某列