如何将指定列的DataFrame从长格式转为宽格式并填充缺失值为0
实现方案
不需要手动创建全0 DataFrame 再遍历填充,用pandas内置的透视方法可以高效完成转换,全程走底层向量化运算,性能远高于逐行遍历。
推荐方案:pivot_table 一步到位
pivot_table 原生支持缺失值填充,完全匹配你的转换规则:
import pandas as pd # 原始数据为df1,直接执行透视 df2 = df1.pivot_table( index="id", columns="date", values="value", fill_value=0 ) # 如果需要补全原始数据中未出现的日期列(比如示例中的day5),加一步重索引即可 full_dates = ["day1", "day2", "day3", "day4", "day5"] df2 = df2.reindex(columns=full_dates, fill_value=0)
执行后得到的df2和你给出的目标结构完全一致,后续直接调用df2.to_numpy()就能得到可用于计算的numpy矩阵。
如果你的场景中存在同一个id+date对应多条value记录的情况,可以换用crosstab指定聚合规则,比如对同组value求和:
df2 = pd.crosstab( index=df1["id"], columns=df1["date"], values=df1["value"], aggfunc="sum", fill_value=0 ).reindex(columns=full_dates, fill_value=0)
性能说明
逐行遍历是Python层的循环逻辑,数据量达到万级以上就会出现明显的性能瓶颈;而上述透视方法底层基于C实现的向量化运算,十万级数据也能毫秒级完成计算。
如果日期列不需要手动枚举,可以先动态获取全量日期排序后传入,不需要硬编码:
# 动态获取所有出现过的日期并排序 full_dates = sorted(df1["date"].unique())
内容的提问来源于stack exchange,提问作者chapayev
相关产品推荐
相关产品推荐

