多索引含日期列调用asfreq后其他列丢失及原日期保留方案
问题原因
填充失效的本质:
把original_date加入分组条件后,每个分组变成(original_date, constant, name)的组合,而original_date和原始date完全一致,导致每个分组仅包含单个日期的一条记录。asfreq("d")的作用是填充分组内的日期间隙,单个日期不存在间隙,因此填充逻辑完全失效。列丢失的原因:
你在groupby后仅选择value列执行apply,此时constant和name仅作为结果的MultiIndex层级存在。但由于每个分组的date与original_date完全重复,reset_index()解析MultiIndex时出现层级混淆,导致constant和name未被正确还原为普通列;同时因为仅操作value列,其他列自然不会出现在结果中。
解决方案
要保留original_date且正常填充日期,需调整分组逻辑和操作范围:
- 分组条件仍用
constant和name(这才是需要统一填充日期的维度) - 对整个分组的所有列执行
asfreq和ffill,而非仅针对value列
修改后的代码:
from datetime import datetime import pandas as pd # 原始数据 df = pd.DataFrame({ "date": [datetime(2023, 8, 31), datetime(2023, 9, 30), datetime(2023, 8, 31), datetime(2023, 9, 30), datetime(2023, 9, 30)], "name": ["a", "a", "b", "b", "c"], "constant": [1, 1, 1, 1, 1], "value": [100, 101, 200, 201, 301], }) # 添加原始日期列 df["original_date"] = df["date"] print("原始数据:") print(df) # 分组填充逻辑 df = ( df.set_index("date") .groupby(["constant", "name"]) # 对整个分组的所有列执行日期填充+前向填充 .apply(lambda x: x.asfreq("d").ffill()) .reset_index() ) print("\n填充后结果:") print(df)
效果说明
- 每个
(constant, name)分组会按日填充日期间隙 original_date列保留原始记录的日期,填充行的original_date自动前向填充为最近的原始日期constant和name列完整保留在结果中
内容的提问来源于stack exchange,提问作者Kris Harper
相关产品推荐
相关产品推荐

