You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何更优雅地按行筛选后填充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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 18:23:15