1 绪论

    在使用python的库,例如pandas,会删除一列或者几列数据;numpy会用到对行或者对列求均值,方差等。

对于二维数组,有时希望对行运算,有时希望对列运算,而对行或者列的运算,是对参数axis=0/1来控制的。

但经常会忘记该使用axis=0,还是axis=1呢?

    其实,只要理解了axis的含义,以后对于axis=0/1的应用,就得心应手了。下面是我对这个参数的一点体会。

 

2 axis含义

axis,谷歌翻译的是 轴,对于坐标轴,axis的参数就是x轴和y轴。但在python的库中,0轴指y轴,1轴指x轴。

对于多维数据,就是0轴,1轴,2轴,,,

对于二维的0轴,1轴,看个图片,简单认识一下。图片来源

python库pandas,numpy的axis=0/1的理解与记忆

在python的库中,你要记住一点:axis的取值,按轴的方向进行计算

轴的方向,就是索引增大的方向。例如,0轴,从上往下的索引就是0,1,2,3,,,所以0轴就是从上往下,1轴就是从左到右。


3 numpy库

需要对行/列取值的,一般是求和,求均值

生成数据:

arr1 = np.random.randint(1,10,[3,4])
array([[1, 1, 2, 9],
       [3, 4, 3, 5],
       [6, 7, 9, 3]])

3.1 求和

3.1.1 各列求和

每一列求和,就变成1行,1*4的形式

沿列的方向求和,就是沿0轴运算,所以axis=0

np.sum(arr1,axis=0)
array([10, 12, 14, 17])

同样的,每一行求和,沿1轴求和,axis=1

np.sum(arr1,axis=1)
array([13, 15, 25])

3.1.2 求均值

按列求均值,即0轴

np.mean(arr1,axis=0)
array([3.33333333, 4.        , 4.66666667, 5.66666667])

按行求均值,即1轴

np.mean(arr1,axis=1)
array([3.25, 3.75, 6.25])

不加axis这个参数,就是对整个数据求和,求平均

其他的,例如求方差,也是这个逻辑。

4 pandas库

4.1删除列

生成dataframe格式数据

import pandas as pd
df1 = pd.DataFrame(np.random.randint(1,10,[3,4]),columns=['a','b','c','d'])

df1

  a b c d
0 8 1 8 4
1 3 2 9 2
2 9 1 1 6

删除前两列,是按行的方向删除,1轴方向

df2 = df1.drop(['a','b'],axis=1)

df2:

  c d
0 8 4
1 9 2
2 1 6

若果,不加axis=1,就报错,labels ['a' 'b'] not contained in axis

4.2 左右拼接还是上下拼接

pd.concat()是对整个表进行左右拼接,或者上下拼接。针对的对象是整个表

4.2.1 左右拼接

构造数据

import pandas as pd
df1 = pd.DataFrame(np.random.randint(1,10,[3,4]),columns=['a','b','c','d'])
df2 = pd.DataFrame(np.random.randint(1,10,[3,4]),columns=['e','f','g','h'])

df1:

  a b c d
0 6 7 1 1
1 1 7 6 4
2 7 9 1 6

 

df2:

  e f g h
0 5 2 7 6
1 3 3 7 4
2 6 7 7 7

左右拼接,也就是沿1轴方向拼接,所以参数axis=1

pd.concat([df1,df2],axis=1)
  a b c d e f g h
0 6 7 1 1 5 2 7 6
1 1 7 6 4 3 3 7 4
2 7 9 1 6 6 7 7 7

4.2.2 上下拼接

上下拼接,就是沿0轴方向拼接,就是axis=0

pd.concat([df1,df2],axis=0)
  a b c d e f g h
0 6.0 7.0 1.0 1.0 NaN NaN NaN NaN
1 1.0 7.0 6.0 4.0 NaN NaN NaN NaN
2 7.0 9.0 1.0 6.0 NaN NaN NaN NaN
0 NaN NaN NaN NaN 5.0 2.0 7.0 6.0
1 NaN NaN NaN NaN 3.0 3.0 7.0 4.0
2 NaN NaN NaN NaN 6.0 7.0 7.0 7.0

    我们会发现,既有左右拼接,也有上下拼接,一团混乱。其实还是上下拼接,只不过只有列名相等的时候才可以正常的上下拼接。这里,自动对表进行了扩展,都扩展成有相同列的新表,没有数据的自动填充NaN。然后是上下拼接,看左侧索引就知道了。

如果把列名都调为 a b c d。验证下结果

df3 = pd.DataFrame(np.random.randint(1,10,[3,4]),columns=['a','b','c','d'])

df3

  a b c d
0 4 1 4 2
1 5 8 7 8
2 9 6 5 9

 

现在df1,df3列名一样,进行上下拼接

pd.concat([df1,df3],axis=0)

Out[106]:

  a b c d
0 6 7 1 1
1 1 7 6 4
2 7 9 1 6
0 4 1 4 2
1 5 8 7 8
2 9 6 5 9

5总结

只要把axis的取值0/1,理解成沿0轴方向运算,沿1轴方向运算,就可以了。如有理解不当,还望指正!

 

相关文章: