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
相关产品推荐
相关产品推荐

