【Python笔记】pandas算数运算和数据对齐


1 算数运算和数据对齐

pandas最重要的一个功能是,它可以对不同索引的对象进行算数运算。在将对象相加时,如果存在不同的索引对,则结果的索引就是该索引对的并集。

import pandas as pd

s1=pd.Series([7.3,-2.5,3.4,1.5],index=list('acde'))
s2=pd.Series([-2.1,3.6,-1.5,4,3.1],index=list('acefg'))

s1
# a    7.3
# c   -2.5
# d    3.4
# e    1.5
# dtype: float64

s2
# a   -2.1
# c    3.6
# e   -1.5
# f    4.0
# g    3.1
# dtype: float64

s1+s2
# a    5.2
# c    1.1
# d    NaN
# e    0.0
# f    NaN
# g    NaN
# dtype: float64

自动的数据对齐操作在不重叠的索引处引入了NaN值,缺失值会在算数运算过程中传播。

对于DataFrame,对齐操作会同时发生在行和列上:

import pandas as pd
import numpy as np

df1=pd.DataFrame(np.arange(9).reshape(3,3),columns=list('bcd'),index=['ohio','texas','colorado'])
df2=pd.DataFrame(np.arange(12.).reshape(4,3),columns=list('bde'),index=['utah','ohio','texas','oregon'])
df1
bcd
ohio012
texas345
colorado678
df2
bde
utah0.01.02.0
ohio3.04.05.0
texas6.07.08.0
oregon9.010.011.0
df1+df2
bcde
coloradoNaNNaNNaNNaN
ohio3.0NaN6.0NaN
oregonNaNNaNNaNNaN
texas9.0NaN12.0NaN
utahNaNNaNNaNNaN

2 在算数方法中填充值

对不同索引的对象进行算数运算时,我们希望在NaN时赋值成为0或其他特殊值进行计算。

df1.add(df2,fill_value=0)
bcde
colorado6.07.08.0NaN
ohio3.01.06.05.0
oregon9.0NaN10.011.0
texas9.04.012.08.0
utah0.0NaN1.02.0

加和规律

  • 数字+NaN=数字+0=数字
  • NaN+NaN=NaN
方法说明
add用于加法(+)的方法
sub用于减法(-)的方法
div用于除法(/)的方法
mul用于乘法(*)的方法

3 DataFrame和Series之间的运算

arr=np.arange(12.).reshape(3,4) # 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.]])

这叫广播(broadcasting),第12章将此进行详细讲解。DataFrame和Series之间的运算差不多也是如此:

frame=pd.DataFrame(np.arange(12.).reshape(4,3),
                   columns=list('bde'),
                   index=['utah','ohio','texas','oregon'])
series=frame.ix[0]
# b    0.0
# d    1.0
# e    2.0
# Name: utah, dtype: float64

frame
bde
utah0.01.02.0
ohio3.04.05.0
texas6.07.08.0
oregon9.010.011.0
frame-series
bde
utah0.00.00.0
ohio3.03.03.0
texas6.06.06.0
oregon9.09.09.0
series2=pd.Series(range(3),index=['b','e','f'])
# b    0
# e    1
# f    2
# dtype: int64

frame+series2
bdef
utah0.0NaN3.0NaN
ohio3.0NaN6.0NaN
texas6.0NaN9.0NaN
oregon9.0NaN12.0NaN

如果你希望匹配行且在列上广播,则必须使用算数运算方法:

series3=frame['d']
# utah       1.0
# ohio       4.0
# texas      7.0
# oregon    10.0
# Name: d, dtype: float64

frame.sub(series3,axis=0)
bde
utah-1.00.01.0
ohio-1.00.01.0
texas-1.00.01.0
oregon-1.00.01.0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值