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

如何在Pandas DataFrame中填充缺失日期并补全np.nan值?

搞定DataFrame缺失日期与NaN补全的问题

嘿,我来帮你解决这个补全缺失项的需求!先模拟一下你描述的原始数据结构,方便咱们一步步操作:

import pandas as pd
import numpy as np

# 构造和你需求匹配的示例数据
df = pd.DataFrame({
    'ID': [1, 1, 2, 2],
    'Day': ['Day1', 'Day2', 'Day2', 'Day3'],
    'Value': [10, 20, 30, 40]
})
print(df)

运行后会看到:

ID    Day  Value
0   1   Day1     10
1   1   Day2     20
2   2   Day2     30
3   2   Day3     40

完美,和你说的一样——ID=1缺了Day3,ID=2缺了Day1。下面给你两种实用的解决方案:

方法一:分组后重新索引(逻辑清晰,适合规则周期)

这种方法的思路是先按ID分组,然后给每个组补上所有需要的Day值,缺失的Value自动填充np.nan:

# 先定义所有必须包含的Day列表
all_required_days = ['Day1', 'Day2', 'Day3']

# 按ID分组处理,重新索引后还原结构
df_filled = df.set_index('Day').groupby('ID').apply(
    lambda group: group.reindex(all_required_days).assign(ID=group.name)
).reset_index().rename(columns={'level_1': 'Day'})

# 调整列的顺序,让结果更符合原始结构(可选)
df_filled = df_filled[['ID', 'Day', 'Value']]
print(df_filled)

输出结果就是咱们想要的完整数据:

ID    Day  Value
0   1   Day1   10.0
1   1   Day2   20.0
2   1   Day3    NaN
3   2   Day1    NaN
4   2   Day2   30.0
5   2   Day3   40.0

方法二:Unstack + Stack(代码简洁,快速出结果)

如果想要更简洁的代码,可以用 pivot 转宽表再转回长表的方式,缺失的Day会自动补全并填充NaN:

# 一步到位:转宽表补全缺失项,再转回长表
df_filled = df.pivot(index='ID', columns='Day', values='Value').stack(dropna=False).reset_index(name='Value')
print(df_filled)

运行后得到的结果和方法一完全一致,而且代码更短,适合快速处理这类问题。

小提示

  • 如果你的Day是真实的日期格式(比如2024-05-01),可以用pd.date_range生成完整的日期序列来替换示例中的all_required_days,比如pd.date_range(start='2024-05-01', periods=3, freq='D')直接保留日期格式,或者转成类似DayX的格式。
  • 要是原始数据还有其他列需要保留,只需要在分组或pivot的时候把这些列也纳入处理逻辑就好。

内容的提问来源于stack exchange,提问作者gabboshow

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:03:42