pandas 笔记005
目录
五、对齐运算
1.算术运算和数据对齐
import numpy as np
import pandas as pd
 
1.1 Series
a1 = pd.Series(np.arange(4),index=['a','b','c','d'])
a2 = pd.Series(np.arange(5),index=['a','r','c','u','k'])
print(a1)
print("="*20)
print(a2)
 
a    0
b    1
c    2
d    3
dtype: int32
====================
a    0
r    1
c    2
u    3
k    4
dtype: int32
 
有相同的索引值相加后结果变为浮点数,不相同则返回NAN值。
a1 + a2  
 
a    0.0
b    NaN
c    4.0
d    NaN
k    NaN
r    NaN
u    NaN
dtype: float64
 
1.2 DataFrame
a3 = pd.DataFrame(np.arange(12).reshape(3,4),index=['a','b','c'],columns=['q','w','e','r'])
a4 = pd.DataFrame(np.arange(9).reshape(3,3),index=['a','u','c'],columns=['m','e','r'])
print(a3)
print("="*20)
print(a4)
 
   q  w   e   r
a  0  1   2   3
b  4  5   6   7
c  8  9  10  11
====================
   m  e  r
a  0  1  2
u  3  4  5
c  6  7  8
 
只有行和列索引都相同的才能运算,否则返回NAN值
a3 + a4  
 
	e	  m	    q	  r	    w
a	3.0	  NaN	NaN	  5.0	NaN
b	NaN	  NaN	NaN	  NaN	NaN
c	17.0  NaN	NaN	  19.0	NaN
u	NaN	  NaN	NaN	  NaN	NaN
 
2.使用填充值的算术方法
2.1 Series
a1 = pd.Series(np.arange(4),index=['a','b','c','d'])
a2 = pd.Series(np.arange(5),index=['a','r','c','u','k'])
print(a1)
print("="*20)
print(a2)
print("="*20)
print(a1 + a2)    #有相同的索引值相加后结果变为浮点数,不相同索引值相加则返回NAN
 
a    0
b    1
c    2
d    3
dtype: int32
====================
a    0
r    1
c    2
u    3
k    4
dtype: int32
====================
a    0.0
b    NaN
c    4.0
d    NaN
k    NaN
r    NaN
u    NaN
dtype: float64
 
使用填充值,不会返回NAN值,如果a1,a2的索引值相同则将对应的值作算术运算,如果不同则作为一行新的数据,形成一个新的Series索引
a1.add(a2,fill_value=0)  #a1+a2 忽略NAN影响
 
a    0.0
b    1.0
c    4.0
d    3.0
k    4.0
r    1.0
u    3.0
dtype: float64
 
2.2 DataFrame
a3 = pd.DataFrame(np.arange(12).reshape(3,4),index=['a','b','c'],columns=['q','w','e','r'])
a4 = pd.DataFrame(np.arange(9).reshape(3,3),index=['a','u','c'],columns=['m','e','r'])
print(a3)
print("="*20)
print(a4)
print("="*20)
print(a3 + a4)   #只有行索引和列索引都相同的才能运算,否则返回NAN
 
   q  w   e   r
a  0  1   2   3
b  4  5   6   7
c  8  9  10  11
====================
   m  e  r
a  0  1  2
u  3  4  5
c  6  7  8
====================
    e     m     q     r     w
a   3.0   NaN   NaN   5.0   NaN
b   NaN   NaN   NaN   NaN   NaN
c  17.0   NaN   NaN   19.0  NaN
u   NaN   NaN   NaN   NaN   NaN
 
只有当两个DataFrame索引独有的行和列独有的索引对应的值才返回NAN,例如下面的 b行m列返回NAN值,其索引值是由a3独有的b和a4独有的m组成的,行和列其中之一的索引值不是独有的,则返回对应DataFrame中的值,例如a行q列中的是a3,a4都有的,返回a3中 a行q列对应的值。
#使用填充值,
a3.add(a4,fill_value=0)  
 
    e	   m	 q	    r	   w
a	3.0	   0.0	 0.0	5.0	   1.0
b	6.0	   NaN	 4.0	7.0	   5.0
c	17.0   6.0	 8.0	19.0   9.0
u	4.0	   3.0	 NaN	5.0	   NaN
 
r 开头字母表示会翻转参数
1/a3
 
q	w	e	r
a	inf	1.000000	0.500000	0.333333
b	0.250	0.200000	0.166667	0.142857
c	0.125	0.111111	0.100000	0.090909
 
a3.rdiv(1)   #翻转div(除法),结果等同 1/a3
 
q	w	e	r
a	inf	1.000000	0.500000	0.333333
b	0.250	0.200000	0.166667	0.142857
c	0.125	0.111111	0.100000	0.090909
 
reindex指定索引和缺失值
将a3的列索引替换为a4的列索引 ,如果索引名字不相同,则返回NAN(不改变原DataFrame索引)
a3.reindex(columns=a4.columns))
 
	m	e	r
a	NaN	2	3
b	NaN	6	7
c	NaN	10	11
 
#对NAN进行填充
a3.reindex(columns=a4.columns,fill_value=66)  #把所有的NAN替换为66(可指定任意值)
 
	m	e	r
a	66	2	3
b	66	6	7
c	66	10	11
 
3.DataFrame和Series混合运算
3.1 按行广播
arr = np.arange(12).reshape(3,4)
arr
 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
 
取出第一行
arr[0] #取出第一行
 
array([0, 1, 2, 3])
 
每一行都减去第一行(按行进行广播)
arr - arr[0] #每一行都减去第一行(按行进行广播)
 
array([[0, 0, 0, 0],
       [4, 4, 4, 4],
       [8, 8, 8, 8]])
 
a3 = pd.DataFrame(np.arange(12).reshape(3,4),index=['a','b','c'],columns=['q','w','e','r'])
a3
 
    q	w	e	r
a	0	1	2	3
b	4	5	6	7
c	8	9	10	11
 
位置索引 iloc[m,n] 第一个参数m表示行,第二个参数n表示列
s1 = a3.iloc[0]   #取出第一行
s1
 
q    0
w    1
e    2
r    3
Name: a, dtype: int32
 
每一行都减去第一行(按行进行广播)
a3-s1    #每一行都减去第一行(按行进行广播)
 
    q	w	e	r
a	0	0	0	0
b	4	4	4	4
c	8	8	8	8
 
3.2 按列广播
取出q这一列
s2 = a3['q']  #取出q这一列
s2
 
a    0
b    4
c    8
Name: q, dtype: int32
 
默认是行axis=1,指定axis='index'或axis=0,按列进行广播(a3所有列分别减去第q列)
a3.sub(s2,axis='index')  #默认是行axis=1,指定axis='index'(或axis=0),按列进行广播(a3所有列分别减去第q列)
 
	q	w	e	r
a	0	1	2	3
b	0	1	2	3
c	0	1	2	3
 
a3.sub(s2,axis=0)  #默认是行axis=1,指定axis=0(或)axis='index',按列进行广播(a3所有列分别减去第q列)
 
    q	w	e	r
a	0	1	2	3
b	0	1	2	3
c	0	1	2	3
 
a3.sub(s2)  #默认情况 axis=1
 
    a	b	c	e	q	r	w
a	NaN	NaN	NaN	NaN	NaN	NaN	NaN
b	NaN	NaN	NaN	NaN	NaN	NaN	NaN
c	NaN	NaN	NaN	NaN	NaN	NaN	NaN