如何在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
相关产品推荐
相关产品推荐

