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

Pandas按id分组补全缺失time组合行并将新增行val填充为b

pandas按分组补全缺失时间行实现方案

实现代码

import pandas as pd

# 原始输入数据
foo = pd.DataFrame({
    'id': [1,1,1,2,2,2,3,3,3,3,3], 
    'time': [2,3,5,1,3,4,1,2,6,7,8],
    'val':['a','a','a','a','a','a','a','a','a','a','a']
})

# 为每个id生成从1到组内最大time的完整时间序列
id_max_time = foo.groupby('id')['time'].max().reset_index()
full_index = id_max_time.apply(
    lambda row: pd.Series({'id': row['id'], 'time': range(1, row['time']+1)}), 
    axis=1
).explode('time').reset_index(drop=True)
full_index['time'] = full_index['time'].astype(int)

# 关联原始数据,缺失值填充为'b'
result = full_index.merge(foo, on=['id', 'time'], how='left').fillna({'val': 'b'})

执行后result的输出和预期完全一致:

id  time val
0    1     1   b
1    1     2   a
2    1     3   a
3    1     4   b
4    1     5   a
5    2     1   a
6    2     2   b
7    2     3   a
8    2     4   a
9    3     1   a
10   3     2   a
11   3     3   b
12   3     4   b
13   3     5   b
14   3     6   a
15   3     7   a
16   3     8   a

核心逻辑

  • 先按id分组计算每组的最大time值,为每个id生成从1开始到最大值的连续time序列,天然覆盖id=1缺失time=1这类起始值缺失的场景
  • 用生成的完整(id, time)组合作为基准表,和原始数据做左连接:原始数据存在的行保留原有val='a',缺失的行val字段为空
  • 最后将空的val字段统一填充为'b'即可,全程按id独立处理,不会出现跨组补全的错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 21:03:39