本文的主要内容是基于中国大学mooc(慕课)中的“Python数据分析与可视化”课程进行整理和总结。
算术运算法则
算术运算根据行列索引,补齐后进行运算,不同索引之间不进行运算,运算默认产生浮点数 ;
补齐时默认填充NaN(空值);
二维和一维,一维和零维(实数)进行广播运算;
采用±*/符号进行的二元运算会产生新的对象;
a = pd.DataFrame(np.arange(12).reshape(3,4))
a
0 1 2 3
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
b = pd.DataFrame(np.arange(20).reshape(4,5))
b
0 1 2 3 4
0 0 1 2 3 4
1 5 6 7 8 9
2 10 11 12 13 14
3 15 16 17 18 19
a + b
标签相同的行和列进行运算,不同的补齐后运算,补齐的值为NaN,NaN与任何元素运算都是NaN。
方法形式的运算
方法 | 说明 |
---|---|
.add(d,**argws) | 类型间加法运算,可选参数 |
.sub(d,**argws) | 类型间减法法运算,可选参数 |
.mul(d,**argws) | 类型间乘法法运算,可选参数 |
.div(d,**argws) | 类型间除法法运算,可选参数 |
这与±*/相比,好处在于可以增加一些可选参数。
a.add(b,fill_value=100)
可以看到使用fill_vallue先对a和b缺少的位置进行填充,随后再进行运算。
不同维度运算的结果如何呢?
b = pd.DataFrame(np.arange(20).reshape(4,5))
b
0 1 2 3 4
0 0 1 2 3 4
1 5 6 7 8 9
2 10 11 12 13 14
3 15 16 17 18 19
c = pd.Series(np.arange(4))
c
0 0
1 1
2 2
3 3
dtype: int32
c - 10
0 -10
1 -9
2 -8
3 -7
dtype: int32
可以看到,一维和0维进行运算使用广播功能,相当于对0维数据使用当前值(10)填充至于一维数据量相同,在进行运算。
c - b
同理c-b也会将一维的c作用到b的每一个维度上,c默认作用到了b的一轴上,b中的每一行都与c做了相应运算。若要指定在0轴上发生运算,也就是希望c中的每一列都减去b中的每一列,这时就需要使用方法形式的运算来增加可选参数axis=0.
b.sub(c,axis=0)
0 1 2 3 4
0 0 1 2 3 4
1 4 5 6 7 8
2 8 9 10 11 12
3 12 13 14 15 16
比较运算法则
- 比较运算只能比较相同索引的元素,不进行补齐;
- 二维和一维,一维和0维使用广播进行运算;
- 使用">","<",">=","<=","!="等运算产生布尔对象;
a = pd.DataFrame(np.arange(20).reshape(4,5))
a
0 1 2 3 4
0 0 1 2 3 4
1 5 6 7 8 9
2 10 11 12 13 14
3 15 16 17 18 19
b = pd.DataFrame(np.arange(20,0,-1).reshape(4,5))
b
0 1 2 3 4
0 20 19 18 17 16
1 15 14 13 12 11
2 10 9 8 7 6
3 5 4 3 2 1
a > b
0 1 2 3 4
0 False False False False False
1 False False False False False
2 False True True True True
3 True True True True True
当同维度进行运算时,需要保证尺寸一致,不存在填充的情况下,尺寸不同会直接报错。
c = pd.Series(np.arange(5))
c
0 0
1 1
2 2
3 3
4 4
dtype: int32
a > c
0 1 2 3 4
0 False False False False False
1 True True True True True
2 True True True True True
3 True True True True True
可以看到,不同维度时,使用广播运算, 默认在1轴。