10.算数和广播
算数和广播:
当对两个Series或者DataFrame对象进行算术运算的时候,返回的结果是两个对象的并集。如果存在某个索引不匹配时,将以缺失值NaN的方式体现,并对以后的操作产生影响。这类似数据库的外连接操作。
Series:
sarr1 = pd.Series(np.arange(5), index=list('abcde'))
sarr2 = pd.Series(np.arange(5, 10), index=list('abcde'))
print('------sarr1')
print(sarr1)
print('------sarr2')
print(sarr2)
print('------相减')
print(sarr2 - sarr1)
print('------相乘')
print(sarr1 * sarr2)
#---------------
------sarr1
a 0
b 1
c 2
d 3
e 4
dtype: int32
------sarr2
a 5
b 6
c 7
d 8
e 9
dtype: int32
------相减
a 5
b 5
c 5
d 5
e 5
dtype: int32
------相乘
a 0
b 6
c 14
d 24
e 36
dtype: int32
DataFrame:
sarr1 = pd.DataFrame(np.arange(25).reshape(5, 5), index=['one', 'two', 'three', 'four', 'five'], columns=list('abcde'))
sarr2 = pd.DataFrame(np.arange(10, 35).reshape(5, 5), index=[1, 2, 'two', 'four', 5],
columns=list('cdeba'))
print('------sarr1')
print(sarr1)
print('------sarr2')
print(sarr2)
print('------相加')
print(sarr2 + sarr1)
#-------------------------
------sarr1
a b c d e
one 0 1 2 3 4
two 5 6 7 8 9
three 10 11 12 13 14
four 15 16 17 18 19
five 20 21 22 23 24
------sarr2
c d e b a
1 10 11 12 13 14
2 15 16 17 18 19
two 20 21 22 23 24
four 25 26 27 28 29
5 30 31 32 33 34
------相加
a b c d e
1 NaN NaN NaN NaN NaN
2 NaN NaN NaN NaN NaN
5 NaN NaN NaN NaN NaN
five NaN NaN NaN NaN NaN
four 44.0 44.0 42.0 44.0 46.0
one NaN NaN NaN NaN NaN
three NaN NaN NaN NaN NaN
two 29.0 29.0 27.0 29.0 31.0
在上述过程中,为了防止NaN对后续的影响,很多时候我们要使用一些填充值:
类似add的方法还有:
- add:加法
- sub:减法
- div:除法
- floordiv:整除
- mul:乘法
- pow:幂次方
DataFrame也可以和Series进行操作,这类似于numpy中不同维度数组间的操作,其中将使用广播机制。我们先看看numpy中的机制:
# numpy 算数和广播
arr = np.arange(12).reshape(3, 4)
print(arr)
# 取第一行,一维数据
print('取第一行')
print(arr[0])
# 广播机制
print('广播机制二维减去一维')
print(arr - arr[0])
# 结果:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
取第一行
[0 1 2 3]
广播机制二维减去一维
[[0 0 0 0]
[4 4 4 4]
[8 8 8 8]]
DataFrame和Series之间的操作是类似的:
arr = pd.DataFrame(np.arange(12).reshape(4, 3), columns=list('bde'), index=['one', 'two', 'three', 'four'])
print('----原数组')
print(arr)
# 取第一行
print('取第一行')
arr_1 = arr.iloc[0]
print(arr_1)
print('广播机制相减')
print(arr - arr_1)
# 如果存在不匹配列,则会引入缺失值
print('如果存在不匹配列,则会引入缺失值')
arr2 = pd.Series(range(3), index=list('bef'))
print(arr2 + arr)
# 结果
----原数组
b d e
one 0 1 2
two 3 4 5
three 6 7 8
four 9 10 11
取第一行
b 0
d 1
e 2
Name: one, dtype: int32
广播机制相减
b d e
one 0 0 0
two 3 3 3
three 6 6 6
four 9 9 9
如果存在不匹配列,则会引入缺失值
b d e f
one 0.0 NaN 3.0 NaN
two 3.0 NaN 6.0 NaN
three 6.0 NaN 9.0 NaN
four 9.0 NaN 12.0 NaN
也可以通过axis=0,axis=1指定列和行。