如何更优雅地按行筛选后填充DataFrame相邻列数据?
优化DataFrame按行范围填充列的方法
问题背景
我有一个记录多个投资组合每日表现的DataFrame,原始数据如下:
Date P1 P2 P3 P4 P5 03.11.2022 0.000000 0.000000 0.000000 0.000000 0.000000 07.11.2022 1,8 2,0 3,1 2,2 2,6 08.11.2022 0,4 -0,3 -0,5 -0,3 -0,3 09.11.2022 -1,7 -1,2 -1,4 -1,9 -2,0 10.11.2022 1,6 0,7 2,1 2,3 2,1 11.11.2022 0,2 0,2 -0,1 0,4 0,1 14.11.2022 0,3 0,1 0,5 0,8 1,0 15.11.2022 -1,4 -1,5 -2,2 -2,8 -2,8 16.11.2022 1,4 1,1 1,4 2,4 1,9 17.11.2022 -0,6 -0,1 -0,8 -0,2 0,3
需要按特定行范围,将相邻列的数据填充到后续列中,最终结果如下:
Date P1 P2 P3 P4 P5 03.11.2022 0.000000 0.000000 0.000000 0.000000 0.000000 07.11.2022 1,8 1,8 1,8 1,8 1,8 08.11.2022 0,4 0,4 0,4 0,4 0,4 09.11.2022 -1,7 -1,7 -1,7 -1,7 -1,7 10.11.2022 1,6 0,7 0,7 0,7 0,7 11.11.2022 0,2 0,2 0,2 0,2 0,2 14.11.2022 0,3 0,1 0,1 0,1 0,1 15.11.2022 -1,4 -1,5 -2,2 -2,2 -2,2 16.11.2022 1,4 1,1 1,4 1,4 1,4 17.11.2022 -0,6 -0,1 -0,8 -0,2 -0,2
目前我用逐段赋值的方式实现:
All_portfolios_by_risk_rate_DataFrame_SG[0:148] = All_portfolios_by_risk_rate_DataFrame_SG.iloc[0:148,[0]] All_portfolios_by_risk_rate_DataFrame_SG['P3'][149:168] = All_portfolios_by_risk_rate_DataFrame_SG['P2'][149:168] All_portfolios_by_risk_rate_DataFrame_SG['P4'][149:168] = All_portfolios_by_risk_rate_DataFrame_SG['P2'][149:168] All_portfolios_by_risk_rate_DataFrame_SG['P5'][149:168] = All_portfolios_by_risk_rate_DataFrame_SG['P2'][149:168] All_portfolios_by_risk_rate_DataFrame_SG['P4'][169:221] = All_portfolios_by_risk_rate_DataFrame_SG['P3'][169:221] All_portfolios_by_risk_rate_DataFrame_SG['P5'][169:221] = All_portfolios_by_risk_rate_DataFrame_SG['P3'][169:221] All_portfolios_by_risk_rate_DataFrame_SG['P5'][222:258] = All_portfolios_by_risk_rate_DataFrame_SG['P4'][222:258]
想知道有没有更优雅的实现方法?
优雅解决方案
可以把填充规则整理成一个配置列表,集中管理所有行段的处理逻辑,再通过循环批量执行,避免重复代码,提升可读性和可维护性。
方法1:规则化循环处理
# 定义填充规则:(行范围, 源列, 目标列列表) fill_rules = [ (slice(0, 148), 'P1', ['P2', 'P3', 'P4', 'P5']), (slice(149, 168), 'P2', ['P3', 'P4', 'P5']), (slice(169, 221), 'P3', ['P4', 'P5']), (slice(222, 258), 'P4', ['P5']) ] # 先复制原数据,避免修改原始值 df = All_portfolios_by_risk_rate_DataFrame_SG.copy() for row_slice, src_col, target_cols in fill_rules: # 一次性给多个目标列赋值,提升效率 src_values = df.loc[row_slice, src_col].values.reshape(-1, 1) df.loc[row_slice, target_cols] = src_values
优势
- 可读性强:所有规则集中展示,一眼就能看懂每个行段的填充逻辑
- 可维护性高:新增或修改规则只需调整
fill_rules列表,无需重复编写赋值语句 - 符合最佳实践:用
df.loc替代链式索引,避免pandas的SettingWithCopyWarning警告 - 效率更高:通过数组重塑实现批量赋值,减少循环次数
内容的提问来源于stack exchange,提问作者Olsen_I
相关产品推荐
相关产品推荐

