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

