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

