如何用Pandas补全DataFrame各年份的周数范围并填充数据?
补全DataFrame中各年份的周数
问题背景
现有通过以下代码读取的DataFrame:
import pandas as pd grouped = pd.read_csv('grouped.csv')
数据结构示例:
Year Week Average m 0 2013 24 29.000000 -0.152174 1 2013 25 22.800000 -6.2 2 2013 26 23.400000 0.6 ... 387 2020 53 47.500000 1.785714
需求:将该DataFrame转换为每个年份都包含range(2,54)所有周数的结构,缺失周数对应的Average和m用空值填充。
原尝试的循环填充方法存在重复行、错误赋值等问题,需优化实现。
最优解决方案
利用Pandas的索引生成与合并功能,无需循环即可高效实现需求:
步骤1:生成全量的Year-Week组合
先获取数据中的所有唯一年份,再为每个年份生成2到53的周数(对应range(2,54)),组合成完整的基准DataFrame:
# 获取所有唯一年份 unique_years = grouped['Year'].unique() # 生成所有需要的Year-Week组合 all_weeks = range(2, 54) full_index = pd.MultiIndex.from_product([unique_years, all_weeks], names=['Year', 'Week']) full_df = full_index.to_frame(index=False)
步骤2:与原数据左连接补全
通过左连接将原数据的Average和m字段匹配到全量组合中,缺失周数自动填充为NaN:
result_df = pd.merge(full_df, grouped, on=['Year', 'Week'], how='left')
完整代码
import pandas as pd # 读取原始数据 grouped = pd.read_csv('grouped.csv') # 生成全量Year-Week组合 unique_years = grouped['Year'].unique() all_weeks = range(2, 54) full_df = pd.MultiIndex.from_product([unique_years, all_weeks], names=['Year', 'Week']).to_frame(index=False) # 左连接补全数据 result_df = pd.merge(full_df, grouped, on=['Year', 'Week'], how='left') # 可选:重置索引(如果需要) result_df = result_df.reset_index(drop=True)
方案优势
- 避免手动循环赋值的索引计算错误,逻辑更清晰
- 利用Pandas内置的向量化操作,执行效率远高于循环
- 自动处理特殊情况(如2020年有53周),无需额外判断
内容的提问来源于stack exchange,提问作者M Kh
相关产品推荐
相关产品推荐

