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)
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
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)