基于特定列条件填充DataFrame缺失值的实现方法
按特定逻辑填充DataFrame中
to列的缺失值 原始DataFrame
| Day | Type | From | to |
|---|---|---|---|
| 01/09/2021 | car | 170 | NaN |
| 02/09/2021 | car | 140 | NaN |
| 03/09/2021 | none | 120 | 77 |
| 04/09/2021 | car | 15 | 45 |
| 05/09/2021 | car | 34 | NaN |
| 06/09/2021 | car | 36 | 84 |
| 07/09/2021 | none | 23 | 11 |
| 08/09/2021 | car | 36 | NaN |
填充规则
- 针对所有
Type为none的行:- 数据集开头到第一个
none行之前的to列缺失值,用该行的from值填充 none行之后的to列缺失值,用该行的to值填充
- 数据集开头到第一个
- 填充缺失值时取最近的
Type为none行对应的值
期望输出
| Day | Type | From | to |
|---|---|---|---|
| 01/09/2021 | car | 170 | 120 |
| 02/09/2021 | car | 140 | 120 |
| 03/09/2021 | none | 120 | 77 |
| 04/09/2021 | car | 15 | 45 |
| 05/09/2021 | car | 34 | 77 |
| 06/09/2021 | car | 36 | 84 |
| 07/09/2021 | none | 23 | 11 |
| 08/09/2021 | car | 36 | 11 |
解决方案
通过标记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)
代码说明
- 构造辅助列:
fill_from:用bfill()将第一个none行的From值向前填充,确保开头到第一个none前的行能取到对应值fill_to:用ffill()将每个none行的to值向后填充,让后续行能取到最近的none行的to值
- 分区间填充:
- 第一个
none行之前的缺失值直接用fill_from覆盖 - 第一个
none行之后的缺失值用fillna()结合fill_to填充,保留原有非缺失的to值
- 第一个
- 清理临时列:删除辅助列,得到最终结果
内容的提问来源于stack exchange,提问作者Maikel Bastawrous
相关产品推荐
相关产品推荐

