如何在DataFrame中补全'day'列的缺失天数并填充缺失值?
补全DataFrame日期序列并填充缺失值的解决方案
这里有个简洁的方法帮你补全day列的完整日期,同时把缺失天数对应的trans值填充为NaN,用pandas就能轻松实现:
步骤1:准备原始数据
首先把你的原始数据转换成pandas DataFrame:
import pandas as pd # 原始DataFrame数据 raw_data = { 'id': [0, 1, 2, 3, 4, 5], 'month': [8, 8, 8, 8, 8, 8], 'day': [1, 2, 3, 4, 6, 8], 'trans': [9, 5, 10, 6, 4, 4] } df = pd.DataFrame(raw_data)
步骤2:生成完整的日期基准表
因为需要补全1到8日的所有天数,先创建一个包含完整day序列的基准表,同时统一month为8:
# 生成1-8日的完整序列 full_day_range = pd.DataFrame({'day': range(1, 9)}) full_day_range['month'] = 8 # 所有行的month都为8
步骤3:合并数据并填充缺失值
用**外连接(outer join)**把原始数据和基准表合并,这样就能保留所有日期,缺失的trans会自动填充为NaN:
# 按month和day合并,保留所有行 merged_df = pd.merge(full_day_range, df, on=['month', 'day'], how='outer')
步骤4:重置id列并调整顺序
最后重置id列,让它变成连续的序列,同时调整列的顺序和你期望的输出一致:
# 生成新的连续id merged_df['id'] = range(len(merged_df)) # 调整列的顺序 merged_df = merged_df[['id', 'month', 'day', 'trans']]
最终输出结果
运行完上面的代码后,merged_df就会和你期望的结果一致:
id month day trans 0 0 8 1 9.0 1 1 8 2 5.0 2 2 8 3 10.0 3 3 8 4 6.0 4 4 8 5 NaN 5 5 8 6 4.0 6 6 8 7 NaN 7 7 8 8 4.0
注:pandas中默认用
NaN表示缺失值,和你写的NAN是同一个意思,如果需要显示为大写的NAN,可以用merged_df['trans'] = merged_df['trans'].fillna('NAN')来替换。
内容的提问来源于stack exchange,提问作者Youssef Razak
相关产品推荐
相关产品推荐

