如何使用pandas填补DataFrame缺口,补全各日期对应的b1/c1/d1行并将缺失col3填为0
实现方案
整套方案基于pandas原生向量化操作实现,无逐行循环逻辑,可适配十万/百万行级的大规模数据处理场景。
第一步:清洗原始脏数据
先过滤无效空行、修正列数据类型,避免空字符串残留干扰后续关联逻辑:
# 过滤掉col1为空的无效行(兼容带前后空格的空值场景) df = df[df['col1'].astype(str).str.strip() != ''] # 修正列数据类型 df['col1'] = df['col1'].astype(int) # 若col1为日期格式,可替换为 pd.to_datetime(df['col1']) df['col3'] = pd.to_numeric(df['col3'], errors='coerce').fillna(0).astype(int) # (可选)若存在同一(col1, col2)重复行,先聚合避免关联后行数膨胀 df = df.groupby(['col1', 'col2'], as_index=False)['col3'].sum()
第二步:生成完整结构基准表
基于col1的所有唯一值、col2的所有唯一值生成全量组合,确保每个日期对应所有类别都有固定行:
# 提取唯一值(若需固定类别顺序,可手动指定列表,如 unique_col2 = ['b1', 'c1', 'd1']) unique_col1 = df['col1'].unique() unique_col2 = df['col2'].unique() # 生成笛卡尔积基准表,原生实现性能远高于逐行循环 full_base = pd.MultiIndex.from_product( [unique_col1, unique_col2], names=['col1', 'col2'] ).to_frame(index=False)
若需要强制纳入未在现有数据中出现的固定类别,直接手动指定
unique_col2的列表即可,无需依赖现有数据的取值。
第三步:关联原始数据并填充缺失值
以完整基准表为主表左关联原始有效数据,对未匹配到的col3缺失值填充为0,得到最终结果:
# 左关联保留全量基准结构 result = full_base.merge( df[['col1', 'col2', 'col3']], on=['col1', 'col2'], how='left' ) # 缺失值填充为0 result['col3'] = result['col3'].fillna(0).astype(int)
最终输出结构校验
运行后输出result即可得到与示例完全一致的结果:
| col1 | col2 | col3 |
|---|---|---|
| 2000 | b1 | 10 |
| 2000 | c1 | 20 |
| 2000 | d1 | 30 |
| 2001 | b1 | 0 |
| 2001 | c1 | 20 |
| 2001 | d1 | 40 |
| 2002 | b1 | 0 |
| 2002 | c1 | 0 |
| 2002 | d1 | 60 |
内容的提问来源于stack exchange,提问作者williamscathy825
相关产品推荐
相关产品推荐

