如何创建仅06月返回值且按Permno分组前向填充的Hold列
匹配需求的Hold列实现方案(pandas环境)
执行步骤
- 基础字段预处理
- 将字符串格式的
Date列转换为标准datetime类型,方便提取月份信息,对应代码:df['Date'] = pd.to_datetime(df['Date']) - 从
Date中提取月份数值,对应代码:df['month'] = df['Date'].dt.month
- 将字符串格式的
- 生成初始Hold列
全程基于Permno分组做逻辑判断,避免不同主体的数据互相干扰:在每个Permno的独立分组范围内,判断当前行的月份是否为6月,匹配则将当前行的Value赋值给Hold列,不匹配则赋值为空值(NaN)。
对应实现代码:df['Hold'] = df.groupby('Permno', group_keys=False).apply( lambda sub_df: sub_df['Value'].where(sub_df['month'] == 6) ) - 组内前向填充(适配后续业务需求)
为了防止前向填充时不同Permno的数值串值,前向填充操作同样要在Permno分组内执行,不做全局填充。
对应实现代码:df['Hold'] = df.groupby('Permno', group_keys=False)['Hold'].ffill()
实用技巧
- 如果不想做datetime格式转换,也可以直接对原始字符串格式的Date做判断:通过检查Date是否以
-06结尾识别6月,替换判断逻辑后的代码为sub_df['Value'].where(sub_df['Date'].str.endswith('-06')),效果完全一致。 - 不要跳过Permno分组直接做全局判断、全局ffill,一旦数据排序出现波动,很容易出现跨Permno的逻辑错误。
内容的提问来源于stack exchange,提问作者Fredrik Clement
相关产品推荐
相关产品推荐

