pandas在具有不同索引的对象间进行算术运算时,如果有任何的索引对不相同的话,在结果中将会把各自的索引联合起来,缺失的会被填充为NaN(可以修改)。
比如:
df1 = DataFrame(np.arange(9.).reshape((3,3)),columns=list('bcd'),index=['Ohio','Texas','Colorado'])
b c d
Ohio 0.0 1.0 2.0
Texas 3.0 4.0 5.0
Colorado 6.0 7.0 8.0
df2 = DataFrame(np.arange(12.).reshape((4,3)),columns=list('bde'),index=['Utah','Ohio','Texas','Oregon'])
b d e
Utah 0.0 1.0 2.0
Ohio 3.0 4.0 5.0
Texas 6.0 7.0 8.0
Oregon 9.0 10.0 11.0
df1+df2
b c d e
Colorado NaN NaN NaN NaN
Ohio 3.0 NaN 6.0 NaN
Oregon NaN NaN NaN NaN
Texas 9.0 NaN 12.0 NaN
Utah NaN NaN NaN NaN
上面结果只有在df1和df2中都有的才会有值,其它均被填充为NaN
df1.add(df2,fill_value=0)
b c d e
Colorado 6.0 7.0 8.0 NaN
Ohio 3.0 1.0 6.0 5.0
Oregon 9.0 NaN 10.0 11.0
Texas 9.0 4.0 12.0 8.0
Utah 0.0 NaN 1.0 2.0
这里为什么还是会有NaN,因为仔细看在df1中的Colorado,它只有bcd三列,但是没有e列,所以仍会被填充为NaN,如果在df1中也有e列,那么就不会是NaN
除了加法还有减法,乘法,除法
add 加法(+)
sub 减法(-)
div 除法(/)
mul 乘法(*)
然后看下面一个减法操作:
arr = np.arange(12.).reshape((3,4))
array([[ 0., 1., 2., 3.],
[ 4., 5., 6., 7.],
[ 8., 9., 10., 11.]])
arr - arr[0]
array([[0., 0., 0., 0.],
[4., 4., 4., 4.],
[8., 8., 8., 8.]])
仔细看结果,结果是arr用每一行都减去arr[0],可以把这个看成一个二维的矩阵减去一维的数组,然后抽象出来就是高维减去低维的操作,低维会在高维中传播(一个个减),这样的现象就是广播
你用DataFrame对象去减Series对象也会出现这样的情况