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

