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

多索引含日期列调用asfreq后其他列丢失及原日期保留方案

问题原因

  1. 填充失效的本质:
    把original_date加入分组条件后,每个分组变成(original_date, constant, name)的组合,而original_date和原始date完全一致,导致每个分组仅包含单个日期的一条记录。asfreq("d")的作用是填充分组内的日期间隙,单个日期不存在间隙,因此填充逻辑完全失效。

  2. 列丢失的原因:
    你在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 05:51:02