Python lambda apply函数使用循环生成列计算相关系数报错解决方案
问题解决方法
报错原因
你收到'DataFrame' object has no attribute 'col'报错的核心原因是:点式取列语法df.列名仅支持固定的列名字面量,无法识别循环变量col。你写的v.col+'_sec_rr'会被pandas解析为「查找v的名为col的属性」,而不是把循环变量col的值拼接成列名。
修正后的代码
你只需要改用方括号索引df[列名]的方式取动态列名即可,参考修改逻辑:
for col in colname: # 原有生成新列的逻辑保持不变 df[col+'_RR'] = df['p_'+col] - df['r2500_ret'] df[col+'_sec_rr'] = df['ret'] - df[col+'_RR'] # 先拼接好本轮要计算的两个动态列名 rr_col = f"{col}_RR" sec_rr_col = f"{col}_sec_rr" # 修正相关系数计算逻辑 dfcorr = df.groupby('symbol').apply(lambda v: v[sec_rr_col].corr(v[rr_col])).to_frame().rename(columns={0:'jets_correlation'}) # 如果需要把计算得到的相关系数合并回原df,可加下面这行 # df = df.merge(dfcorr, on='symbol', how='left')
额外优化建议
如果不需要单独保存每个分组的相关系数表,只想把相关系数回填到原DataFrame对应分组的所有行,可以直接用transform逻辑减少一次merge操作:
df[f"{col}_jets_correlation"] = df.groupby('symbol').apply( lambda x: x[sec_rr_col].corr(x[rr_col]) ).reindex(df['symbol']).values
内容的提问来源于stack exchange,提问作者Andy Jensen
相关产品推荐
相关产品推荐

