如何为pandas DataFrame缺失年份添加空值行以适配多折线图绘制
Pandas补全国家缺失年份行的实现方法
你可以直接用pandas内置的索引重排功能实现需求,不需要额外安装工具,核心逻辑是生成所有国家+所有年份的全量组合,再和原数据匹配即可,代码示例如下:
import pandas as pd # 假设你从SQL导入的原始DataFrame命名为df # 1. 取全局年份的最小、最大值生成完整年份序列 min_year = df['date'].min() max_year = df['date'].max() full_years = range(min_year, max_year + 1) # 2. 取所有唯一国家列表 countries = df['country'].unique() # 3. 生成国家+年份的全组合,匹配原数据后重置索引,缺失值自动填充为NaN result_df = df.set_index(['country', 'date'])\ .reindex(pd.MultiIndex.from_product([countries, full_years], names=['country', 'date']))\ .reset_index()
如果你需要把缺省的NaN替换为其他默认值(比如0),只需要在reindex()方法后追加.fillna(0)即可。
如果更习惯用表关联的逻辑实现,也可以用下面的写法,效果完全一致:
# 生成全量国家年份维度表 dim_df = pd.MultiIndex.from_product( [df['country'].unique(), range(df['date'].min(), df['date'].max()+1)], names=['country', 'date'] ).to_frame(index=False) # 左关联原始数据得到补全结果 result_df = dim_df.merge(df, on=['country', 'date'], how='left')
两种方法都可以自动适配你当前数据里的年份区间,不需要手动调整参数,对于你只有6个国家的场景,执行效率没有任何差异。
内容的提问来源于stack exchange,提问作者Edward
相关产品推荐
相关产品推荐

