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

在Pandas中复制行并补全ID对应年度数据的方案问询

没问题!这是个很常见的Pandas数据补全需求,本质是要生成ID和目标年份的全量笛卡尔积,再和原数据匹配补全缺失值,我给你分步拆解实现:

具体解决步骤

1. 先构建ID与年份的完整组合

首先提取原数据里的所有唯一ID,再定义需要覆盖的年份列表,用pd.MultiIndex.from_product生成所有可能的ID+Year组合,转成DataFrame:

import pandas as pd
import numpy as np

# 你的原始数据
df = pd.DataFrame({'ID': [1,1,2,2,2,3], 'year': [2017, 2018, 2017, 2018, 2019, 2018], 'count': [1,2,2,3,4,1]})

# 生成全量ID+年份组合
unique_ids = df['ID'].unique()
target_years = [2017, 2018, 2019]
full_df = pd.MultiIndex.from_product([unique_ids, target_years], names=['ID', 'year']).to_frame(index=False)

2. 左连接原数据补全count值

用pd.merge做左连接,把原数据中存在的count值匹配到对应的组合上,不存在的会自动填充为np.nan:

df_i_want = pd.merge(full_df, df, on=['ID', 'year'], how='left')

验证输出结果

运行后打印df_i_want,就是你期望的格式:

print(df_i_want)
# 输出:
    ID  year  count
0    1  2017    1.0
1    1  2018    2.0
2    1  2019    NaN
3    2  2017    2.0
4    2  2018    3.0
5    2  2019    4.0
6    3  2017    NaN
7    3  2018    1.0
8    3  2019    NaN

简化版(一行代码搞定)

如果嫌步骤繁琐,也可以把两步合并成一行,逻辑完全一致:

df_i_want = pd.merge(
    pd.MultiIndex.from_product([df['ID'].unique(), [2017,2018,2019]], names=['ID','year']).to_frame(index=False),
    df,
    on=['ID','year'],
    how='left'
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 08:02:33