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的库中,你要记住一点: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轴方向运算,就可以了。如有理解不当,还望指正!