Pandas的一个最重要的功能是,可以对不同索引的对象进行数据运算。
1、两个Series对象的运算
相同索引上的元素直接相加,索引不同的元素默认为NA值。
import pandas as pd
import numpy as np
from pandas import Series, DataFrame
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
2、两个DataFrame对象的运算
相同索引及相同列上的元素直接相加,索引或列不同的元素默认为NA值。
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
3、在算数运算时填充值
看上面的一大片NaN,感觉好像不是很舒适,可以用调用算数函数的方式,为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
我用的例子跟书上的不一样,然后发现fill_value并不是把所有的NaN全都设置为0,而是将两个数组不重叠的索引或列上的数值置为0,然后再完成算数,但如果某个索引和列对应的数据在两个数组中都没有,那么其数值仍然是Na。
4、DataFrame与Series之间的运算(广播)
DataFrame与Series之间的运算可以分为两种情况:
一是匹配列,沿着行广播。
frame = DataFrame(np.arange(12).reshape((4, 3)), columns = list('bde'), index = ['Utah', 'Ohio', 'Texas', 'Oregon'])
series = frame.ix['Utah']
frame - series
输出:
b d e
Utah 0 0 0
Ohio 3 3 3
Texas 6 6 6
Oregon 9 9 9
如果DataFrame的列在Series的索引中找不到,则以Na填充。
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
如果希望DataFrame的行匹配到Series的index,并且在列上广播,则必须使用调用函数方法。
series3 = frame['d']
frame.sub(series3, axis = 0)
输出:
b d e
Utah -1 0 1
Ohio -1 0 1
Texas -1 0 1
Oregon -1 0 1
axis代表要匹配的轴,这里要匹配的是DataFrame的行,所以axis = 0。