《Python for Data Analysis》
算术运算和数据对齐
pandas可以对不同索引的对象进行算术运算。
例如:当对象相加时,如果存在不同的索引对,其结果的索引就是该索引对的并集。自动的数据对齐操作在不重叠的索引处引入了NA值。并且会在算术运算中传播。
In [1]: import numpy as np
In [2]: import pandas as pd
In [3]: from pandas import Series, DataFrame
In [4]: df1 = DataFrame(np.arange(12).reshape((3,4)),columns=list('abcd'))
In [5]: df2 = DataFrame(np.arange(20).reshape((4,5)),columns=list('abcde'))
In [6]: df1
Out[6]:
a b c d
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
In [7]: df2
Out[7]:
a b c d e
0 0 1 2 3 4
1 5 6 7 8 9
2 10 11 12 13 14
3 15 16 17 18 19
In [8]: df1+df2
Out[8]:
a b c d e
0 0.0 2.0 4.0 6.0 NaN
1 9.0 11.0 13.0 15.0 NaN
2 18.0 20.0 22.0 24.0 NaN
3 NaN NaN NaN NaN NaN
在算术方法中填充值
In [9]: df1.add(df2, fill_value=0)
Out[9]:
a b c d e
0 0.0 2.0 4.0 6.0 4.0
1 9.0 11.0 13.0 15.0 9.0
2 18.0 20.0 22.0 24.0 14.0
3 15.0 16.0 17.0 18.0 19.0
In [10]: df1.reindex(columns=df2.columns, fill_value=0)
Out[10]:
a b c d e
0 0 1 2 3 0
1 4 5 6 7 0
2 8 9 10 11 0
DataFrame和Series之间的运算
广播
In [12]: arr = np.arange(12).reshape((3,4))
In [13]: arr
Out[13]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
In [14]: arr[0] #行
Out[14]: array([0, 1, 2, 3])
In [15]: arr - arr[0]
Out[15]:
array([[0, 0, 0, 0],
[4, 4, 4, 4],
[8, 8, 8, 8]])
默认情况下,DataFrame和Series之间的算术运算会将Series的索引匹配到DataFrame的列,然后沿着行一直向下传播。(series=frame.ix[0]
)
上例是Series取DataFrame的行,但是如果想匹配到DataFrame的行,且希望在列上传播,必须使用算术运算方法。frame.sub(series, axis=0)
。传入的轴号就是希望匹配的轴。(series = frame['a']
)