DataFrame和numpy中神奇的广播函数

来源:互联网 发布:qq旋风下线知乎 编辑:程序博客网 时间:2024/06/06 20:39

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对应位置的值替换成-1000df.where(df_mask,-1000)# 将# 两个df的加减乘除也是根据对应元素的操作df+dfdf*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
原创粉丝点击