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

基于特定列条件填充DataFrame缺失值的实现方法

按特定逻辑填充DataFrame中to列的缺失值

原始DataFrame

DayTypeFromto
01/09/2021car170NaN
02/09/2021car140NaN
03/09/2021none12077
04/09/2021car1545
05/09/2021car34NaN
06/09/2021car3684
07/09/2021none2311
08/09/2021car36NaN

填充规则

  • 针对所有Type为none的行:
    • 数据集开头到第一个none行之前的to列缺失值,用该行的from值填充
    • none行之后的to列缺失值,用该行的to值填充
  • 填充缺失值时取最近的Type为none行对应的值

期望输出

DayTypeFromto
01/09/2021car170120
02/09/2021car140120
03/09/2021none12077
04/09/2021car1545
05/09/2021car3477
06/09/2021car3684
07/09/2021none2311
08/09/2021car3611

解决方案

通过标记none行的区间,结合bfill和ffill实现需求,代码如下:

import pandas as pd

# 构造原始DataFrame
df = pd.DataFrame({
    'Day': ['01/09/2021', '02/09/2021', '03/09/2021', '04/09/2021',
            '05/09/2021', '06/09/2021', '07/09/2021', '08/09/2021'],
    'Type': ['car', 'car', 'none', 'car', 'car', 'car', 'none', 'car'],
    'From': [170, 140, 120, 15, 34, 36, 23, 36],
    'to': [pd.NA, pd.NA, 77, 45, pd.NA, 84, 11, pd.NA]
})

# 提取none行的from值,用于填充开头到第一个none前的缺失
df['fill_from'] = df.loc[df['Type'] == 'none', 'From'].bfill()
# 提取none行的to值,用于填充none行之后的缺失
df['fill_to'] = df.loc[df['Type'] == 'none', 'to'].ffill()

# 获取第一个none行的索引,分区间填充
first_none_idx = df[df['Type'] == 'none'].index[0]
df.loc[:first_none_idx-1, 'to'] = df.loc[:first_none_idx-1, 'fill_from']
df.loc[first_none_idx+1:, 'to'] = df.loc[first_none_idx+1:, 'to'].fillna(df.loc[first_none_idx+1:, 'fill_to'])

# 清理临时辅助列
df = df.drop(['fill_from', 'fill_to'], axis=1)

print(df)

代码说明

  1. 构造辅助列:
    • fill_from:用bfill()将第一个none行的From值向前填充,确保开头到第一个none前的行能取到对应值
    • fill_to:用ffill()将每个none行的to值向后填充,让后续行能取到最近的none行的to值
  2. 分区间填充:
    • 第一个none行之前的缺失值直接用fill_from覆盖
    • 第一个none行之后的缺失值用fillna()结合fill_to填充,保留原有非缺失的to值
  3. 清理临时列:删除辅助列,得到最终结果

内容的提问来源于stack exchange,提问作者Maikel Bastawrous

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 04:30:57