DataFrame和numpy中神奇的广播函数

numpy的神奇广播函数

在使用pandas的时候,一般来说对两个DataFrame(简写df)的加减乘除,会自动索引对齐,很方便,DataFrame与Series之间的运算也会沿着指定的轴进行广播。最为人称道的广播形式大概就是apply和applymap这样的操作了,很方便,很强大。 
但是也有不能满足需求的时候,比如一个DataFrame根据另一个DataFrame对应的元素进行自定义ufunc操作的时候,就不能满足了。庆幸的是numpy提供了一个广播函数,可以自定义广播函数,然后对两个DataFrame对应位置元素进行自定义操作。

1.pandas元素级操作

pandas的元素级操作是对每个元素进行相同的操作,比如格式转换,判断是否为空等。

df = DataFrame(np.arange(12).reshape(3,4))
# 判断为空
df.isnull()
# 对每个元素转字符串
df.applymap(lambda s:str(s))
# 执行数学操作
df.applymap(lambda s:s**2)
df.apply(lambda s:s**2)
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

2.DF根据另一个DF进行操作

对A的每个元素,根据B的相同位置的元素进行相应的操作。

# pandas官网例子
df = pd.DataFrame({'AAA' : [4,5,6,7], 'BBB' : [10,20,30,40],'CCC' : [100,50,-30,-50]})
df_mask = pd.DataFrame({'AAA' : [True] * 4, 'BBB' : [False] * 4,'CCC' : [True,False] * 2})
# 根据df_mask的值,将df对应位置的值替换成-1000
df.where(df_mask,-1000)
# 将
# 两个df的加减乘除也是根据对应元素的操作
df+df
df*df
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

3.DF根据另一个DF进行操作

两个df除了加减乘除外的操作怎么办呢?比如A中的元素是否包含在B中对应元素呢?或者将A、B的对应元素转成字符串然后进行其他操作呢。 
这里就用到了numpy的ufunc函数,可以自定义广播函数,然后对每个元素进行相同的操作。

frompyfunc,把Python里的函数(可以是自写的)转化成ufunc,用法是frompyfunc(func, nin, nout),其中func是需要转换的函数,nin是函数的输入参数的个数,nout是此函数的返回值的个数。

注意:frompyfunc函数无法保证返回的数据类型都完全一致,因此返回一个中间类型object,需要再次obj.astype(np.float64)之类将其元素类型强制调齐。

# 将两个元素转成字符串后拼接起来
def add_elements(x,y):
    return str(x)+"+"+str(y)
# 将自定义函数转成广播函数
add_them=np.frompyfunc(add_elements,2,1)
# 两个DataFrame的操作
add_them(df,df*2)
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值