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

如何为Pandas DataFrame按名称补全1至最大time值的缺失行?

补全Pandas分组内时间序列并填充缺失值

原数据与目标需求

原DataFrame:

import pandas as pd

df = pd.DataFrame({
    "names": ["foo",  "boo", "coo","coo"],
    "time": [1,4,2,3],
    "values": [20,10,15,12]
})

需要实现:对每个names分组,生成从1到该组time最大值的所有整数时间行,缺失的values用NaN填充,最终得到如下结果:

target_df = pd.DataFrame({
    "names": ["foo","boo","boo", "boo","boo","coo","coo","coo"],
    "time": [1,1,2,3,4,1,2,3],
    "values": [20,float('nan'),float('nan'),float('nan'),10,float('nan'),15,12]
})

方法一:分组后使用reindex补全

这是最简洁的实现方式,利用groupby对每个分组单独处理:

# 按names分组补全时间序列
result = df.groupby('names').apply(
    lambda group: group.set_index('time')
                       .reindex(range(1, group['time'].max() + 1))
                       .reset_index()
).reset_index(drop=True)

# 调整列顺序与目标一致
result = result[['names', 'time', 'values']]

步骤说明:

  1. groupby('names'):按名称对数据分组
  2. 对每个分组:
    • 将time设为索引,方便后续按索引补全
    • reindex(range(1, group['time'].max() + 1)):生成从1到该组最大time的所有整数索引,缺失的values自动填充为NaN
  3. reset_index():恢复time为列,并重置分组后的多级索引

方法二:生成全量时间序列后合并

如果需要更直观的分步操作,可以先生成所有可能的names-time组合,再与原数据左连接:

# 获取每个names对应的最大time值
max_time_per_name = df.groupby('names')['time'].max().reset_index()

# 生成每个names的完整time序列
full_time_series = max_time_per_name.apply(
    lambda row: pd.DataFrame({
        'names': row['names'],
        'time': range(1, row['time'] + 1)
    }), axis=1
).concat()

# 左连接匹配原数据的values值,缺失项自动填充NaN
result = pd.merge(full_time_series, df, on=['names', 'time'], how='left')

步骤说明:

  1. 先统计每个分组的最大time
  2. 为每个分组生成从1到最大time的所有时间行
  3. 通过左连接将原数据的values匹配到对应位置,未匹配到的自动填充NaN

验证结果

可以用Pandas的测试工具验证结果是否与目标一致:

pd.testing.assert_frame_equal(result, target_df, check_dtype=False)

(注:原数据values为int类型,补全后会转为float类型,因此忽略 dtype 检查)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 11:48:26