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

如何将指定列的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 02:46:00