今天学习的东西有点多,学到这里我也有点累了…但尽量还是弄完吧,弄完后好好休息下。
因为分析需要,我要对列做比较复杂的计算,在特定列的每一行中提取指定位置、指定长度的值,并且,这个指定位置还要根据这一行数据的长度来决定。这种比较复杂的自定义列计算或者自定义行计算用自带方法肯定是不行的,我之前了解过,这种情况可以用pd. apply() 的方法,但是当时没有细学,所以今天再好好看看。
pd.apply() 方法和 pandas 的其它方法不一样,其它方法别的不说,计算路径是明确的,len() 就是计算长度,sum() 就是计算合计数,但是apply() 不是,apply() 的计算路径是自己定的。
自己定义计算路径虽然麻烦,但是灵活性非常强。但在享受它的灵活性之前,我还是要先弄清楚这个所谓的计算路径到底是怎么回事。翻阅资料我发现,apply() 方法内部应该是一个循环结构,两个主要参数。两个主要参数是func 和axis,代表循环内容和循环方式,具体是:将pd 中的数据按行循环(axis=1)或者按列循环(axis=0),将一行或者一列的数据构建一个Series,然后循环带入取得结果。
循环内部的计算则是由自定义函数func 规定,这个函数只能接收一个参数,并且这个参数的数据类型是Series,每一次只返回一个值。整个循环计算完毕后,所有结果会整合成一个Series 返回。因此,如果想要自定义计算列,就要按列循环,如果想要自定义计算行,就要按行循环。
func 这个参数为函数类型数据,这种情况我在以前没有碰到过。函数可以是用def 定义的有名函数,也可以是用lambda 定义的匿名函数,但是如上所述,这个函数只有唯一参数,并且这个参数的数据类型是Series,return 出来的也只能是一个值。
比如一个4行8列的 df 拿去做 apply(),指定 axis=1,也就是按行循环,一共循环4次,每次循环的内容是一个len = 8 的Series。经过自定义函数运算,一共得到4个值,这4个值被组成一个 Series 返回。
def 定义函数我之前了解得多一点,但是lambda函数了解得还不多,因此也翻阅了相关资料,找到lambda 的语法如下:
lambda argument_list: expression
argument list:参数列表,与一般 def 函数一致
expression:参数表达式
lambda 函数的特征就是简便,函数只有一行,都不需要命名。
哎,学到这里脑袋也早就过载了,休息吧休息吧…
(本文图片转载自知乎,感谢大佬!)
网友评论