pandas最重要的一个功能就是对不同索引的对象进行算术运算

s1 = Series([7.3, -2.5, 3.4, 1.5], index=['a', 'c', 'd', 'e'])
s2 = Series([-2.1, 3.6, -1.5, 4, 3.1], index=['a', 'c', 'e', 'f', 'g'])
s1 + s2

a    5.2
c    1.1
d    NaN
e    0.0
f    NaN
g    NaN
dtype: float64

自动的数据对齐操作在不重叠的索引处引入NA值。

对于DataFrame,对齐操作会同时发生在行和列上。

df1 = DataFrame(np.arange(9.).reshape((3, 3)), columns=list('bcd'),
                index=['Ohio', 'Texas', 'Colorado'])
df2 = DataFrame(np.arange(12.).reshape((4, 3)), columns=list('bde'),
                index=['Utah', 'Ohio', 'Texas', 'Oregon'])
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 = DataFrame(np.arange(12.).reshape((3, 4)), columns=list('abcd'))
df2 = DataFrame(np.arange(20.).reshape((4, 5)), columns=list('abcde'))
df1.add(df2, fill_value=0)


        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

DataFrame和Series之间的运算

首先,计算一个二维数组与某行之间的差

arr = np.arange(12.).reshape((3, 4))
arr - arr[0]

array([[ 0.,  0.,  0.,  0.],
       [ 4.,  4.,  4.,  4.],
       [ 8.,  8.,  8.,  8.]])

在numpy中这种现象叫做广播。其实,DataFrame与Series之间的运算也差不多

frame = DataFrame(np.arange(12.).reshape((4, 3)), columns=list('bde'),
                  index=['Utah', 'Ohio', 'Texas', 'Oregon'])
series = frame.ix[0]
frame - series


       b    d    e
Utah    0.0    0.0    0.0
Ohio    3.0    3.0    3.0
Texas    6.0    6.0    6.0
Oregon    9.0    9.0    9.0

如果某个索引值在DataFrame的列或Series的索引找不到,则参与运算的两个对象会重新索引并形成并集

series2 = Series(range(3), index=['b', 'e', 'f'])
frame + series2


        b    d    e    f
Utah    0.0    NaN    3.0    NaN
Ohio    3.0    NaN    6.0    NaN
Texas    6.0    NaN    9.0    NaN
Oregon    9.0    NaN    12.0    NaN

如果希望匹配行,在列上广播,则必须使用算术运算方法

series3 = frame['d']
frame.sub(series3, axis=0)

    b    d    e
Utah    -1.0    0.0    1.0
Ohio    -1.0    0.0    1.0
Texas    -1.0    0.0    1.0
Oregon    -1.0    0.0    1.0

results matching ""

    No results matching ""