【4.1.1.1】Pandas--计算

一、算术运算法则

算术运算根据行列索引,补齐后运算,运算默认产生浮点数 补齐时缺项填充NaN (空值)

二维和一维、一维和零维间为广播运算 采用+ ‐ * /符号进行的二元运算产生新的对象

import pandas as pd
import numpy as np 

a= pd.DataFrame(np.arange(12).reshape(3,4))
print a
   0  1   2   3
0  0  1   2   3
1  4  5   6   7
2  8  9  10  11

b = pd.DataFrame(np.arange(20).reshape(4,5))
print b
	0   1   2   3   4
0   0   1   2   3   4
1   5   6   7   8   9
2  10  11  12  13  14
3  15  16  17  18  19

print a+b
	  0     1     2     3   4
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

print a*b
	  0     1      2      3   4
0   0.0   1.0    4.0    9.0 NaN
1  20.0  30.0   42.0   56.0 NaN
2  80.0  99.0  120.0  143.0 NaN
3   NaN   NaN    NaN    NaN NaN

数据类型的算术运算

方法 说明
.add(d, **argws) 类型间加法运算,可选参数
.sub(d, **argws) 类型间减法运算,可选参数
.mul(d, **argws) 类型间乘法运算,可选参数
.div(d, **argws) 类型间除法运算,可选参数

案例:

import pandas as pd
import numpy as np 

a= pd.DataFrame(np.arange(12).reshape(3,4))
print a
   0  1   2   3
0  0  1   2   3
1  4  5   6   7
2  8  9  10  11

b = pd.DataFrame(np.arange(20).reshape(4,5))
print b
	0   1   2   3   4
0   0   1   2   3   4
1   5   6   7   8   9
2  10  11  12  13  14
3  15  16  17  18  19

e = b.add(a,fill_value=100)
print e
	   0      1      2      3      4
0    0.0    2.0    4.0    6.0  104.0
1    9.0   11.0   13.0   15.0  109.0
2   18.0   20.0   22.0   24.0  114.0
3  115.0  116.0  117.0  118.0  119.0

f = a.mul(b,fill_value = 0)
print f
	  0     1      2      3    4
0   0.0   1.0    4.0    9.0  0.0
1  20.0  30.0   42.0   56.0  0.0
2  80.0  99.0  120.0  143.0  0.0
3   0.0   0.0    0.0    0.0  0.0

案例:

import pandas as pd
import numpy as np 


b = pd.DataFrame(np.arange(20).reshape(4,5))
print b
	0   1   2   3   4
0   0   1   2   3   4
1   5   6   7   8   9
2  10  11  12  13  14
3  15  16  17  18  19

c =pd.Series(np.arange(4))
print c
0    0
1    1
2    2
3    3
dtype: int64

print c-10
0   -10
1    -9
2    -8
3    -7
dtype: int64

print b-c
	  0     1     2     3   4
0   0.0   0.0   0.0   0.0 NaN
1   5.0   5.0   5.0   5.0 NaN
2  10.0  10.0  10.0  10.0 NaN
3  15.0  15.0  15.0  15.0 NaN

print b.sub(c,axis=0)
	0   1   2   3   4
0   0   1   2   3   4
1   4   5   6   7   8
2   8   9  10  11  12
3  12  13  14  15  16

不同维度间为广播运算,一维Series默认在轴1参与运算 使用运算方法可以令一维Series参与轴0运算

减法 sub

>>> a = pd.DataFrame([2, 1, 1, np.nan], index=['a', 'b', 'c', 'd'],
...                  columns=['one'])
>>> a
   one
a  2.0
b  1.0
c  1.0
d  NaN
>>> b = pd.DataFrame(dict(one=[1, np.nan, 1, np.nan],
...                       two=[3, 2, np.nan, 2]),
...                  index=['a', 'b', 'd', 'e'])
>>> b
   one  two
a  1.0  3.0
b  NaN  2.0
d  1.0  NaN
e  NaN  2.0
>>> a.sub(b, fill_value=0)
   one  two
a  1.0  -3.0
b  1.0  -2.0
c  1.0  NaN
d  -1.0  NaN
e  NaN  -2.0

绝对值

Series中的绝对数值

>>> s = pd.Series([-1.10, 2, -3.33, 4])
>>> s.abs()
0    1.10
1    2.00
2    3.33
3    4.00
dtype: float64

二、 比较运算法则

比较运算只能比较相同索引的元素,不进行补齐 二维和一维、一维和零维间为广播运算 采用> < >= <= == !=等符号进行的二元运算产生布尔对象

import pandas as pd
import numpy as np 


b = pd.DataFrame(np.arange(12).reshape(3,4))
d = pd.DataFrame(np.arange(12,0,-1).reshape(3,4))
c =pd.Series(np.arange(4))

print b
   0  1   2   3
0  0  1   2   3
1  4  5   6   7
2  8  9  10  11

print d
	0   1   2  3
0  12  11  10  9
1   8   7   6  5
2   4   3   2  1

print a>d
	   0      1      2      3
0  False  False  False  False
1  False  False  False   True
2   True   True   True   True

print a==d
	   0      1      2      3
0  False  False  False  False
1  False  False   True  False
2  False  False  False  False

print a>c
	   0      1      2      3
0  False  False  False  False
1   True   True   True   True
2   True   True   True   True

print c>0
0    False
1     True
2     True
3     True
dtype: bool

同维度运算,尺寸一致 不同维度,广播运算,默认在1轴

三、比较

3.1 max

from pandas.core.frame import DataFrame
a=[1,2,10,4]#列表a
b=[5,6,7,8]#列表b
bb=['a','b','z','e']#列表b

c={"a" : a,
   "b" : b,
  "bb" : bb}#将列表a,b转换成字典

data=DataFrame(c)#将字典转换成为数据框

print data

data.drop(columns=['bb'])

print '\n test1'
print data.max(axis=0)   # axis=0 获得每一列的最大值;axis=1,获得每一行的最大值
print type(data.max(axis=0))

print '\n test2'
print data.max(axis=0).values  #获得series的值
print data.max(axis=0).index   # 获得series的索引

print '\n test3'

print data.max(axis=1)

print(data)

结果:

    a  b bb
0   1  5  a
1   2  6  b
2  10  7  z
3   4  8  e

 test1
a     10
b      8
bb     z
dtype: object
<class 'pandas.core.series.Series'>

 test2
[10 8 'z']
Index([u'a', u'b', u'bb'], dtype='object')

 test3
0    a
1    b
2    z
3    e
dtype: object
    a  b bb
0   1  5  a
1   2  6  b
2  10  7  z
3   4  8  e

参考资料

药企,独角兽,苏州。团队长期招人,感兴趣的都可以发邮件聊聊:tiehan@sina.cn
个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn