对于series而言,对于index相同的值,会自动对齐相加,对于未重叠的部分,会将他们展示并用NAN值填充(类似于数据库当中的外连接所不同的是用NAN值填充了)
In [26]: s1 = pd.Series([7.3, -2.5, 3.4, 1.5], index=[‘a‘, ‘c‘,‘d‘, ‘e‘])
In [27]: s2 = pd.Series([-2.1, 3.6, -1.5, 4, 3.1],index=[‘a‘, ‘c‘, ‘e‘, ‘f‘, ‘g‘])
In [28]: s1
Out[28]:
a 7.3
c -2.5
d 3.4
e 1.5
dtype: float64
In [29]: s2
Out[29]:
a -2.1
c 3.6
e -1.5
f 4.0
g 3.1
dtype: float64
In [30]: s1+s2
Out[30]:
a 5.2
c 1.1
d NaN
e 0.0
f NaN
g NaN
dtype: float64
对于dataframe而言结果也是一致的,只是它的对齐对象需要是index和column都相同的部分,未重叠的部分会以NAN值填充。
In [31]: df1 = pd.DataFrame(np.arange(9.).reshape((3, 3)), columns=list(‘bcd‘),index=[‘Ohio‘, ‘Texas‘, ‘Colorado‘])
In [32]: df1
Out[32]:
b c d
Ohio 0.0 1.0 2.0
Texas 3.0 4.0 5.0
Colorado 6.0 7.0 8.0
In [33]: df2 = pd.DataFrame(np.arange(12.).reshape((4, 3)), columns=list(‘bde‘),index=[‘Utah‘, ‘Ohio‘, ‘Texas‘, ‘Oregon‘])
In [34]: df2
Out[34]:
b d e
Utah 0.0 1.0 2.0
Ohio 3.0 4.0 5.0
Texas 6.0 7.0 8.0
Oregon 9.0 10.0 11.0
In [35]: df1+df2
Out[35]:
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
以NAN值填充那些不重叠的部分可能不是我们想要的,我们想以两个DF当中原本的值去填充,这就更像是外连接了,这时就可以使用df.add,单纯的add是行不通的,需要参数fill_value=0,参数fill_value=0是将两者不重叠的部分用0填充,所以最后得到的结果就是,原本不重叠的部分以NAN值填充的部分以0进行填充,相加的结果是原本的df的值。
In [143]: df1 Out[143]: a b c d 0 0.0 1.0 2.0 3.0 1 4.0 5.0 6.0 7.0 2 8.0 9.0 10.0 11.0 In [144]: df2 Out[144]: a b c d e 0 0.0 1.0 2.0 3.0 4.0 1 5.0 6.0 7.0 8.0 9.0 2 10.0 11.0 12.0 13.0 14.0 3 15.0 16.0 17.0 18.0 19.0 In [145]: df1+df2 Out[145]: 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 [146]: df1.add(df2) Out[146]: 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 [147]: df1.add(df2,fill_value=0) Out[147]: 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
除了加法以外,还有以下算术方法,以r开头的函数没有什么不同只是会反转参数。
类似于numpy的多维数组与一维数组之间的运算,pandas的dataframe与series之间的运算也是类似的。
In [148]: arr = np.arange(12.).reshape((3, 4)) In [149]: arr Out[149]: array([[ 0., 1., 2., 3.], [ 4., 5., 6., 7.], [ 8., 9., 10., 11.]]) In [150]: arr[0] Out[150]: array([0., 1., 2., 3.]) In [151]: arr-arr[0] Out[151]: array([[0., 0., 0., 0.], [4., 4., 4., 4.], [8., 8., 8., 8.]])
当我们从arr当中减去arr[0],每一行都会这样做,这种从上到下都会执行相同操作的方式叫做广播。
In [152]: frame = pd.DataFrame(np.arange(12.).reshape((4, 3)),columns=list(‘bde‘),index=[‘Utah‘, ‘Ohio‘, ‘Texas‘, ‘Oregon‘]) In [153]: frame Out[153]: b d e Utah 0.0 1.0 2.0 Ohio 3.0 4.0 5.0 Texas 6.0 7.0 8.0 Oregon 9.0 10.0 11.0 In [154]: series=frame.iloc[0] In [155]: series Out[155]: b 0.0 d 1.0 e 2.0 Name: Utah, dtype: float64 In [156]: frame-series Out[156]: 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之间的运算当计算时,发现有未重叠的部分的那么未重叠的部分将以NAN值填充,并显示。
In [158]: series2 = pd.Series(range(3), index=[‘b‘, ‘e‘, ‘f‘]) In [159]: frame+series2 Out[159]: 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
假如要按列进行广播,则需要用算术函数并且传入轴
In [167]: series3=frame[‘b‘] In [168]: series3 Out[168]: Utah 0.0 Ohio 3.0 Texas 6.0 Oregon 9.0 Name: b, dtype: float64 In [169]: frame.add(series3,axis=0) Out[169]: b d e Utah 0.0 1.0 2.0 Ohio 6.0 7.0 8.0 Texas 12.0 13.0 14.0 Oregon 18.0 19.0 20.0
Numpy的元素级应用方法也可以应用于pandas对象。
In [170]: frame = pd.DataFrame(np.random.randn(4, 3), columns=list(‘bde‘),index=[‘Utah‘, ‘Ohio‘, ‘Texas‘, ‘Oregon‘]) In [171]: frame Out[171]: b d e Utah -0.295097 0.327180 0.054291 Ohio 1.550133 1.418037 0.498021 Texas -0.401473 -1.064156 -0.288853 Oregon -0.193640 0.058295 -0.781221 In [172]: np.abs(frame) Out[172]: b d e Utah 0.295097 0.327180 0.054291 Ohio 1.550133 1.418037 0.498021 Texas 0.401473 1.064156 0.288853 Oregon 0.193640 0.058295 0.781221
pandas本身也有将函数应用于pandas对象的方法,applymap,apply,map,不同的是applymap是只能整个数组,apply是用于一个series或者整个dataframe,map是只能用于series级别
In [174]: frame[‘b‘].apply(lambda x: abs(x)) Out[174]: Utah 0.295097 Ohio 1.550133 Texas 0.401473 Oregon 0.193640 Name: b, dtype: float64 In [175]: frame[‘b‘].map(lambda x: abs(x)) Out[175]: Utah 0.295097 Ohio 1.550133 Texas 0.401473 Oregon 0.193640 Name: b, dtype: float64
In [176]: frame.applymap(lambda x: abs(x)) Out[176]: b d e Utah 0.295097 0.327180 0.054291 Ohio 1.550133 1.418037 0.498021 Texas 0.401473 1.064156 0.288853 Oregon 0.193640 0.058295 0.781221
apply还可以用在整个frame
In [182]: frame.apply(lambda x: abs(x)) Out[182]: b d e Utah 0.295097 0.327180 0.054291 Ohio 1.550133 1.418037 0.498021 Texas 0.401473 1.064156 0.288853 Oregon 0.193640 0.058295 0.781221
因此在实际使用过程当中推荐使用apply就可以了,因为他既可以用在frame也可以用在series当中。
python数据分析(七) python pandas--series和dataframe的算术运算和数据对齐
原文:https://www.cnblogs.com/xiaosanye/p/12107599.html