Pandas对比前一日数据识别缺失Name并补0生成新DataFrame
解决方法
你可以用Pandas的重索引/行列转换快速实现需求,以下是可直接运行的代码:
方案1:unstack+stack简洁实现
import pandas as pd # 你给出的原始数据构造逻辑 df = pd.DataFrame({'Date': {0:'2020-04-01', 1:'2020-04-01', 2:'2020-04-01', 3:'2020-04-02', 4:'2020-04-02', 5:'2020-04-03', 6:'2020-04-03', 7:'2020-04-03'}, 'Name': {0:'AA', 1:'BB', 2:'CC', 3:'AA', 4:'BB', 5:'AA', 6:'BB', 7:'CC'}, 'Weight':{0:1, 1:3, 2:6, 3:1, 4:4, 5:2, 6:5, 7:7}}) df = df.set_index(['Date']) # 核心处理逻辑 df = df.set_index('Name', append=True)\ .unstack(fill_value=0)\ .stack()\ .reset_index(level='Name')
运行后输出的结果和你给出的预期完全一致,每个日期都包含全量Name,缺失的Weight自动填充为0。
方案2:手动构造全量索引实现
如果更习惯显式指定全量维度的逻辑,可以用以下方案:
# 提取所有唯一的日期、Name值 all_dates = df.index.unique() all_names = df['Name'].unique() # 生成日期+Name的全量笛卡尔积索引 full_index = pd.MultiIndex.from_product([all_dates, all_names], names=['Date', 'Name']) # 重索引填充缺失值 df = df.set_index('Name', append=True)\ .reindex(full_index, fill_value=0)\ .reset_index(level='Name')
内容的提问来源于stack exchange,提问作者WillCo
相关产品推荐
相关产品推荐

