python 匿名函数(lamda函数)结合apply在高效大数据处理方面有着较大的用处,但麻烦的是,lamda函数严格意义上只能有一个返回值,面对需要多个返回值的场景就很麻烦。 例如,根据报表数据计算静态PE、滚动PE、动态PE,一次遍历基本就能完成,但如果怎么获得一次遍历后多个返回值,并很方便的应用呢? 我们继续上面的例子:
如果按以下例子直接调用返回值

def  calculate_PE(x1,x2,...)
    计算
    ...
    return pe_static,pe_TTM,pe_TR
主程序
...
# 把市盈率(PE)和基本面数据拼接
df['pe_static'],df['pe_TTM'],df['pe_TR']=df_code.apply(lambda row:calculate_PE((x1,x2,...),axis=1)

将会报错ValueError: too many values to unpack (expected 3) 即返回值和变量不匹配

为啥呢,主要是df_code.apply(lambda row:calculate_PE((x1,x2,…),axis=1) 实际返回值是一个以(returnVar1,returnVar2,returnVar3)元组元素组成的Series类型,这么用当然会报错。

换个用法,把元组组成的Series,转化位dataframe即可

def  calculate_PE(x1,x2,...)
    计算
    ...
    return pe_static,pe_TTM,pe_TR
主程序
...
# 把市盈率(PE)和基本面数据拼接
pe=df_code.apply(lambda row:calculate_PE((x1,x2,...),axis=1)

df_pe=pd.DataFrame(tuple(pe.values),columns=["pe_static","pe_TTM","pe_TR"],index=pe.index)
df['pe_static']=df_pe["pe_static"]
df['pe_TTM']=df_pe["pe_TTM"]
df['pe_TR']=df_pe["pe_TR"]

这样就成功了,注意index=pe.index ,可以保证按index序匹配,不建议省略

12-09 18:22