pandas中的算术和数据对齐
数据对齐
pandas中,对Series和DataFrame进行算术计算时,会自动对齐索引,如果一个索引不是在两份数据中都存在,相应的位置上会产生缺失值。
- Series
s1 = pd.Series(np.arange(4), index=list('abcd'))
s2 = pd.Series(np.arange(4), index=list('cdef'))
s1+s2
>>> a NaN
b NaN
c 2.0
d 4.0
e NaN
f NaN
dtype: float64
# 索引['a', 'b', 'e', 'f']没有交叠,产生了缺失值
- DataFrame
df1 = pd.DataFrame(np.arange(4).reshape(2,2), index=list('ab'), columns=list('cd'))
df2 = pd.DataFrame(np.arange(4).reshape(2,2), index=list('ae'), columns=list('df'))
df1
>>> c d
a 0 1
b 2 3
df2
>>> d f
a 0 1
e 2 3
df1+df2
>>> c d f
a NaN 1.0 NaN
b NaN NaN NaN
e NaN NaN NaN
如何用计算方法避免缺失值
可以在Series和DataFrame上使用计算方法,定义当缺失值存在时,填入何值。
s1 = pd.Series(np.arange(4), index=list('abcd'))
s2 = pd.Series(np.arange(4), index=list('cdef'))
s1.add(s2, fill_value=0)
>>> a 0.0
b 1.0
c 2.0
d 4.0
e 2.0
f 3.0
dtype: float64
df1 = pd.DataFrame(np.arange(4).reshape(2,2), index=list('ab'), columns=list('cd'))
df2 = pd.DataFrame(np.arange(4).reshape(2,2), index=list('ae'), columns=list('df'))
df1.add(df2)
>>> c d f
a 0.0 1.0 1.0
b 2.0 3.0 NaN
e NaN 2.0 3.0
# 这里['b', 'f']和['e', 'c']位置出现了缺失值,是因为这两个索引值在df1和df2中都不存在
算术方法
pandas中有以下算术方法,其中翻转方法中参数是相反的。
方法 | 翻转方法 |
---|---|
add | radd |
sub | rsub |
div | rdiv |
floordiv | rfloordiv |
mul | rmul |
pow | rpow |
DataFrame和Series之间的计算
- DataFrame和Series的数学操作中会将Series的索引和DataFrame的列进行匹配,并广播到各行。
df = pd.DataFrame(np.arange(12).reshape(3,4), columns=list('abcd'))
s = df.loc[0]
df
>>> a b c d
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
s
>>> a 0
b 1
c 2
d 3
df-s
>>> a b c d
0 0 0 0 0
1 4 4 4 4
2 8 8 8 8
- 使用算术方法,指定axis='index’或者axis=0可以实现在列上进行广播。
df = pd.DataFrame(np.arange(12).reshape(3,4), columns=list('abcd'))
s = df['a']
df
>>> a b c d
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
s
>>> 0 0
1 4
2 8
df.sub(s, axis='index')
>>> a b c d
0 0 1 2 3
1 0 1 2 3
2 0 1 2 3