如何用前一日完整数据填充DataFrame周末缺失的多行记录
解决方案:批量填充DataFrame中日期对应的多行数据
问题描述
现有一个仅包含工作日数据的DataFrame,示例数据及代码如下:
import pandas as pd import numpy as np df = pd.DataFrame({'BAS_DT': ['2023-01-02', '2023-01-03', '2023-01-04', '2023-01-05', '2023-01-05', '2023-01-05', '2023-01-06', '2023-01-07'], 'CUS_NO': [np.nan, np.nan, '900816636', '900816636', '900816946', '900816931', np.nan, np.nan], 'VALUE': [np.nan, np.nan, 10, 10, 7, 8, np.nan, np.nan], 'BR': [np.nan, np.nan, 100, 100, 200, 300, np.nan, np.nan]})
其中2023-01-06和2023-01-07对应的行全为NaN,需要将这两个日期的行替换为与2023-01-05完全相同的多行记录。常规ffill方法仅能填充单行,无法满足需求,期望输出如下:
BAS_DT CUS_NO VALUE BR 0 2023-01-02 NaN NaN NaN 1 2023-01-03 NaN NaN NaN 2 2023-01-04 900816636 10.0 100.0 3 2023-01-05 900816636 10.0 100.0 4 2023-01-05 900816946 7.0 200.0 5 2023-01-05 900816931 8.0 300.0 7 2023-01-06 900816636 10.0 100.0 8 2023-01-06 900816946 7.0 200.0 9 2023-01-06 900816931 8.0 300.0 10 2023-01-07 900816636 10.0 100.0 11 2023-01-07 900816946 7.0 200.0 12 2023-01-07 900816931 8.0 300.0
解决方案
通过提取模板、批量复制、拼接数据的方式实现,完整代码如下:
import pandas as pd import numpy as np # 原始数据 df = pd.DataFrame({'BAS_DT': ['2023-01-02', '2023-01-03', '2023-01-04', '2023-01-05', '2023-01-05', '2023-01-05', '2023-01-06', '2023-01-07'], 'CUS_NO': [np.nan, np.nan, '900816636', '900816636', '900816946', '900816931', np.nan, np.nan], 'VALUE': [np.nan, np.nan, 10, 10, 7, 8, np.nan, np.nan], 'BR': [np.nan, np.nan, 100, 100, 200, 300, np.nan, np.nan]}) # 1. 提取2023-01-05的所有有效行作为填充模板 template = df[df['BAS_DT'] == '2023-01-05'].copy() # 2. 定义需要填充的目标日期 target_dates = ['2023-01-06', '2023-01-07'] # 3. 为每个目标日期生成对应的填充数据 filled_data = [] for date in target_dates: temp_df = template.copy() temp_df['BAS_DT'] = date filled_data.append(temp_df) # 4. 过滤原数据中的全空行,拼接有效原数据和填充数据 filtered_original = df.dropna(how='all') final_result = pd.concat([filtered_original] + filled_data, ignore_index=True) print(final_result)
步骤说明
- 提取模板:通过布尔索引筛选出
2023-01-05的所有行,作为后续填充的基准数据 - 生成填充数据:遍历目标日期,复制模板并替换日期列,得到每个日期对应的完整多行记录
- 拼接结果:先过滤原数据中的全空行,再将原有效数据与新生成的填充数据拼接,最后重置索引保证连续性
内容的提问来源于stack exchange,提问作者hoa tran
相关产品推荐
相关产品推荐

