这篇教程pandas对齐运算的实现示例写得很实用,希望能帮到您。
1.算术运算和数据对齐
import numpy as npimport 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值。 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值 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 开头字母表示会翻转参数 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]])
取出第一行 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表示列 q 0 w 1 e 2 r 3 Name: a, dtype: int32
每一行都减去第一行(按行进行广播) q w e r a 0 0 0 0 b 4 4 4 4 c 8 8 8 8
3.2 按列广播
取出q这一列 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
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
到此这篇关于pandas对齐运算的实现示例的文章就介绍到这了,更多相关pandas对齐运算内容请搜索51zixue.net以前的文章或继续浏览下面的相关文章希望大家以后多多支持51zixue.net! 详解python连接telnet和ssh的两种方式 python计算机视觉OpenCV库实现实时摄像头人脸检测示例 |