pandas dataframe groupby后如何补全分组缺失日期生成30天完整窗口
实现方案
首先做基础数据预处理:
- 修正原有
groupby代码的语法错误(缺右引号),并将日期列转为pandas的datetime格式:
import pandas as pd # 若你原数据第一列列名为`Data`,请替换下方所有`Date`为`Data`即可 df_daily['Date'] = pd.to_datetime(df_daily['Date'])
- 定义你需要补全的30天日期范围:
# 可根据实际需求自定义起始日期 start_date = '2021-01-01' target_date_range = pd.date_range(start=start_date, periods=30, name='Date')
方法1:分组重索引实现(推荐分组操作场景)
对每个(type, state)分组的日期索引做重索引,自动补全缺失日期:
df_output = df_daily.set_index('Date') \ .groupby(['type', 'state'], group_keys=False) \ .apply(lambda group: group.reindex(target_date_range)) \ .reset_index()
该方法会自动将缺失的price字段填充为NaN,type和state字段会自动继承分组对应值,完全符合你给出的输出效果。
方法2:全量组合左连接实现(逻辑更直观)
先构造所有日期、车型、州的全量组合,再左关联原始数据匹配价格:
# 提取所有唯一的(车型,州)组合 type_state_pairs = df_daily[['type', 'state']].drop_duplicates() # 生成日期+车型+州的所有可能组合 all_combinations = pd.MultiIndex.from_product( [target_date_range, type_state_pairs['type'], type_state_pairs['state']], names=['Date', 'type', 'state'] ).to_frame(index=False) # 左连接匹配原始价格,缺失值自动为NaN df_output = all_combinations.merge(df_daily, on=['Date', 'type', 'state'], how='left')
如果需要每个分组单独按自身最早日期往后推30天,只需修改方法1中的日期范围生成逻辑即可:
df_output = df_daily.set_index('Date') \ .groupby(['type', 'state'], group_keys=False) \ .apply(lambda group: group.reindex(pd.date_range(group.index.min(), periods=30))) \ .reset_index()
内容的提问来源于stack exchange,提问作者Amn Kh
相关产品推荐
相关产品推荐

