当我们遇到有axis参数的方法时,脑子里的第一反应应该是:这个方法一定是沿着某一方向进行某种“聚合”或者“过滤”操作。在此场景下,Axis参数就是用来设定操作方向的:是垂直方向还是水平方向?
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参数的方法,往往都是要沿着某一方向进行“聚合”或者“过滤”操作!