如何在Python中对DataFrame浮点列批量应用自定义函数生成新列
可行,以下是具体实现方案及替代方法
基础实现方案(适合新手理解)
假设你的DataFrame名为df,日期列名为Date,已导入numpy和pandas:
- 确认收益率计算函数(若未定义可直接用下方代码):
import numpy as np def calculate_return(x): return np.log(x.div(x.shift(3)))
- 筛选需要处理的浮点类型列(排除日期列):
# 获取所有浮点类型列 float_columns = df.select_dtypes(include=['float64', 'float32']).tolist() # 移除日期列(避免误处理) float_columns = [col for col in float_columns if col != 'Date']
- 批量应用函数生成新列:
for col in float_columns: df[f"{col}_Ret"] = calculate_return(df[col])
更简洁的实现方式
方式1:字典推导式+assign方法(一行完成)
df = df.assign(**{ f"{col}_Ret": np.log(df[col] / df[col].shift(3)) for col in df.select_dtypes(include=['float64', 'float32']).columns if col != 'Date' })
方式2:先处理再合并
# 单独处理目标列生成收益率DataFrame ret_df = df[float_columns].apply(lambda x: np.log(x/x.shift(3))) # 重命名列名 ret_df.columns = [f"{col}_Ret" for col in ret_df.columns] # 合并回原DataFrame df = pd.concat([df, ret_df], axis=1)
注意事项
- 由于使用
shift(3),新生成的收益率列前3行会是NaN值,可根据模型需求用df.dropna()删除这些行,或用df.fillna()填充(比如0、均值等)。 - 若DataFrame中存在其他非浮点、非日期的列,上述方法会自动跳过,无需额外过滤。
内容的提问来源于stack exchange,提问作者CristinaK
相关产品推荐
相关产品推荐

