Pandas长表转宽表后重采样:保留标识与变量字段
嘿,我来帮你搞定这个困扰!你之前因为索引不唯一导致重采样失败,转成多级列宽表确实是个好思路,下面一步步给你讲清楚怎么做:
第一步:把长表转成多级列宽表
首先,假设你的原始数据是长格式(包含date、identifier、variable、value这几列),我们需要将identifier和variable转为列的层级,date作为唯一索引。这样就能解决索引不唯一的问题。
如果你的数据中每个(date, identifier, variable)组合都是唯一的,直接用pivot:
# 转换为多级列宽表 wide_df = df.pivot(index='date', columns=['identifier', 'variable'], values='value')
如果存在重复的组合(同一个日期下,同一个标识和变量有多条数据),用pivot_table指定聚合函数避免报错,比如保留第一个值:
wide_df = df.pivot_table( index='date', columns=['identifier', 'variable'], values='value', aggfunc='first' # 也可以用'mean'等其他聚合方式,根据你的需求选择 )
转换后的数据结构会是这样:索引是唯一的日期,列是(identifier, variable)的多级组合,每个单元格对应对应标识和变量的数值。
第二步:执行重采样与填充
现在索引是唯一的日期,直接对宽表执行重采样和向前填充就没问题了:
# 按天重采样,并用ffill向前填充缺失值 resampled_wide = wide_df.resample('D').ffill()
这一步会自动保留所有identifier和variable对应的列,不会丢失任何标识或变量信息。
第三步:(可选)转回长格式
如果之后需要回到原来的长表结构(把identifier和variable变回列),用stack方法即可:
# 转回长表,恢复identifier和variable字段 resampled_long = resampled_wide.stack(['identifier', 'variable']).reset_index(name='value')
这样得到的结果就是完成重采样后的长表,包含所有你需要保留的字段。
为什么这个方法可行?
你之前的代码失败是因为把date设为索引后,同一个日期下有多个identifier或variable的行,导致索引不唯一——而resample要求索引是唯一的时间序列。转成多级列宽表后,每个日期只对应一行数据,索引唯一,重采样就能正常执行,同时通过多级列完整保留了标识和变量的信息。
内容的提问来源于stack exchange,提问作者firstworldchild

