python数据分析(七) python pandas--series和dataframe的算术运算和数据对齐

算术运算和数据对齐

对于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

df.add函数

以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开头的函数没有什么不同只是会反转参数。

 dataframe和series之间的运算

类似于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当中。

猜你喜欢

转载自www.cnblogs.com/xiaosanye/p/12107599.html