使用Python Pandas补全缺失日期并重复对应行数据
Pandas补全日期缺失并重复对应ID数据的解决方案
问题背景
给定如下初始DataFrame:
import pandas as pd data = {'Date': ['1-Dec-23', '1-Dec-23', '1-Dec-23', '5-Dec-23', '5-Dec-23', '5-Dec-23'], 'Balance': [10, 20, 1000, 50, 100, 200], 'ID': [1, 2, 3, 1, 2, 3]} df = pd.DataFrame(data)
需要补全2023-12-02至2023-12-04的缺失日期,且这些日期下每个ID的Balance数据沿用前一个有效日期(2023-12-01)的值,最终得到指定格式的输出。
实现代码
import pandas as pd # 初始化数据 data = {'Date': ['1-Dec-23', '1-Dec-23', '1-Dec-23', '5-Dec-23', '5-Dec-23', '5-Dec-23'], 'Balance': [10, 20, 1000, 50, 100, 200], 'ID': [1, 2, 3, 1, 2, 3]} df = pd.DataFrame(data) # 1. 将日期列转换为datetime格式,方便时间序列处理 df['Date'] = pd.to_datetime(df['Date'], format='%d-%b-%y') # 2. 生成从最小日期到最大日期的完整日期序列 full_date_range = pd.date_range(start=df['Date'].min(), end=df['Date'].max(), freq='D') # 3. 构建日期与ID的笛卡尔积,确保每个日期下所有ID都有记录 unique_ids = df['ID'].unique() full_multi_index = pd.MultiIndex.from_product([full_date_range, unique_ids], names=['Date', 'ID']) # 4. 重新索引并前向填充缺失的Balance数据 result_df = df.set_index(['Date', 'ID']).reindex(full_multi_index).ffill().reset_index() # 5. 将Date设为索引,匹配指定输出格式 result_df = result_df.set_index('Date') # 查看结果 print(result_df)
代码说明
- 日期格式转换:把字符串类型的日期转为
datetime,是时间序列处理的基础。 - 完整日期序列:生成覆盖起始到结束日期的每日序列,确保没有遗漏日期。
- 笛卡尔积索引:保证每个日期下都包含所有ID,避免出现某日期缺少部分ID的情况。
- 前向填充(ffill):对于缺失的Balance值,自动沿用该ID最近的有效数据,正好符合需求中缺失日期使用12-01数据的要求。
内容的提问来源于stack exchange,提问作者Danial Mansoor
相关产品推荐
相关产品推荐

