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

Python中基于百分比条件对DataFrame实现部分bfill空值填充

Pandas 实现自定义百分比部分后向填充

实现逻辑:从后往前遍历所有amount非空的行,计算每一行前方连续空值的总长度,按对应percentage计算需要填充的空值数量后,填充靠近当前非空值的前N个空值即可,不会影响更早的空值,也不会覆盖后续已有的有效值。

完整实现代码

import pandas as pd
import numpy as np
# 可替换为实际业务使用的DataFrame
df = pd.DataFrame({
    'amount': [np.nan, np.nan, np.nan, np.nan, 3.0, np.nan, np.nan, 5.0, np.nan, 10.0],
    'percentage': [0, 0, 0, 0, 50, 0, 0, 30, 0, 100]
})

# 提取所有amount非空的行信息:索引、值、对应百分比
valid_amount_info = df[df['amount'].notna()][['amount', 'percentage']].reset_index().values.tolist()

# 倒序遍历非空行,从后往前处理避免覆盖后续有效值
for idx in range(len(valid_amount_info)-1, -1, -1):
    curr_pos, curr_val, curr_pct = valid_amount_info[idx]
    # 确定当前非空值前方连续空值的左边界
    if idx == 0:
        left_limit = 0
    else:
        left_limit = valid_amount_info[idx-1][0] + 1
    # 计算前方连续空值总数量
    total_nan = curr_pos - left_limit
    if total_nan <= 0:
        continue
    # 计算需要填充的数量,取整规则可按需调整
    fill_num = round(total_nan * curr_pct / 100)
    if fill_num <= 0:
        continue
    # 填充靠近当前非空值的前fill_num个空值
    df.loc[curr_pos - fill_num : curr_pos - 1, 'amount'] = curr_val

# 输出处理后的结果
print(df)

运行效果说明

以上述测试数据为例,处理后amount列结果为:
[nan, nan, 3.0, 3.0, 3.0, nan, 5.0, 5.0, 10.0, 10.0]
完全符合需求:

  • 值为3.0、百分比50的行前方有4个空值,填充靠近它的2个空值
  • 值为5.0、百分比30的行前方有2个空值,30%对应0.6,四舍五入填充1个空值
  • 值为10.0、百分比100的行前方有1个空值,全部填充

自定义调整说明

如果需要修改取整规则,仅需要修改fill_num的计算逻辑即可:

  • 向下取整:fill_num = int(total_nan * curr_pct / 100)
  • 向上取整:导入math模块后使用fill_num = math.ceil(total_nan * curr_pct / 100)

内容的提问来源于stack exchange,提问作者Mayur Zambare

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 03:48:02