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

按groups和date分组补全缺失days行的Pandas实现需求

在Pandas中实现类似R的complete功能补全缺失行

我懂你要的是什么!在R里用dplyr+tidyr的complete一行搞定的补全缺失行操作,在Pandas里同样可以轻松实现,而且有几种不同的方式,我给你详细说说:

首先先看你提供的原始DataFrame:

import pandas as pd

df = pd.DataFrame({ 
    'groups': ['A', 'A','A','A','A','A','A','A','A', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B'], 
    'date': [6535, 6535, 6535, 6535, 6535, 6535, 6535, 6535, 6535, 6535, 6535, 6535, 6535, 6535, 6535, 6535, 6535, 6535, 6535], 
    'days': [1, 2, 4, 7, 11, 12, 13, 14, 15, 1, 3, 4, 5, 6, 9, 10, 12, 13, 14], 
    'price': [64, 82, 31, 77, 21, 39, 79, 67, 45, 66, 24, 60, 64, 56, 41, 29, 60, 57, 68] 
})

方法一:分组后合并完整days序列

这种方法和R的complete逻辑最接近,按groups和date分组后,给每个组生成1-15的完整days序列,再用左连接合并补全缺失行:

def complete_days(group):
    # 生成1到15的完整days列表
    full_days = pd.DataFrame({'days': range(1, 16)})
    # 左连接合并,保留所有days,缺失的price自动填充NaN
    return pd.merge(full_days, group, on='days', how='left')

# 分组应用函数,最后重置索引整理结果
result = df.groupby(['groups', 'date'], group_keys=False).apply(complete_days).reset_index(drop=True)

方法二:用MultiIndex重新索引(更简洁)

这种方法通过构造包含所有可能组合的多级索引,再重新索引原始数据来补全行,代码更短:

# 构造包含所有groups、date、1-15 days的完整多级索引
full_index = pd.MultiIndex.from_product([
    df['groups'].unique(),
    df['date'].unique(),
    range(1, 16)
], names=['groups', 'date', 'days'])

# 设置原始数据的索引为多级索引,再重新索引到完整索引
result = df.set_index(['groups', 'date', 'days']).reindex(full_index).reset_index()

两种方法都能得到你想要的结果:每个groups+date分组下,days从1到15完整存在,缺失的days对应的price列填充为NaN,groups和date则保留对应分组的值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:34:52