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

Pandas按日期分组处理:zone列无ELSE值时新增对应行

Pandas分组补全ELSE行实现方案

实现逻辑为按date字段分组后校验每组zone列是否存在ELSE值,不存在则新增对应RATE为0的ELSE行,以下是两种可行实现方案:

方案1:分组自定义处理(逻辑直观,适合小数据量)

通过groupby对每个日期分组单独处理,灵活适配zone值不固定的场景:

import pandas as pd

# 构造源DataFrame
df = pd.DataFrame({
    'date': ['2021-09-01', '2021-09-01', '2021-09-01', '2021-09-02', '2021-09-02'],
    'zone': ['NY', 'LA', 'ELSE', 'NY', 'LA'],
    'RATE': [90, 80, 10, 60, 70]
})

def add_else_row(group):
    if 'ELSE' not in group['zone'].values:
        # 构造待新增的ELSE行
        else_row = pd.DataFrame({
            'date': [group['date'].iloc[0]],
            'zone': ['ELSE'],
            'RATE': [0]
        })
        return pd.concat([group, else_row], ignore_index=True)
    return group

result = df.groupby('date', group_keys=False).apply(add_else_row).reset_index(drop=True)
print(result)

方案2:重索引补全(性能更高,适合大数据量)

如果zone的枚举值固定(示例中为NY、LA、ELSE),可以通过构造全量索引的方式批量补全,执行效率更高:

import pandas as pd

# 构造源DataFrame
df = pd.DataFrame({
    'date': ['2021-09-01', '2021-09-01', '2021-09-01', '2021-09-02', '2021-09-02'],
    'zone': ['NY', 'LA', 'ELSE', 'NY', 'LA'],
    'RATE': [90, 80, 10, 60, 70]
})

# 取所有唯一日期
all_dates = df['date'].unique()
# 构造日期+zone的全组合索引
full_index = pd.MultiIndex.from_product([all_dates, ['NY', 'LA', 'ELSE']], names=['date', 'zone'])
# 重索引补全缺失行,RATE缺失值默认填充0
result = df.set_index(['date', 'zone']).reindex(full_index, fill_value=0).reset_index()
print(result)

两种方案执行后均可得到预期输出:

date  zone  RATE
0  2021-09-01    NY    90
1  2021-09-01    LA    80
2  2021-09-01  ELSE    10
3  2021-09-02    NY    60
4  2021-09-02    LA    70
5  2021-09-02  ELSE     0

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 10:00:06