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

如何用前一日完整数据填充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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 17:40:38