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

如何在Pandas DataFrame中以日期为唯一索引按ID创建对应值列

实现方案

基础实现代码

直接使用pandas的pivot方法即可完成行列转换,无匹配值的位置会自动填充NaN,你可以按需转换为None:

import pandas as pd

# 假设你从数据库查询得到的原始DataFrame名为df
# 先标准化日期格式,避免后续索引出现格式不一致的问题
df['日期'] = pd.to_datetime(df['日期'])

# 执行透视转换
pivot_df = df.pivot(
    index='日期',
    columns='ID',
    values='值'
).rename_axis(columns=None)

# 如果需要把NaN统一替换为None,执行下面这行即可
pivot_df = pivot_df.where(pd.notnull(pivot_df), None)

千万级数据优化方案

如果数据量过大导致普通pivot内存溢出,可以采用以下两种方案优化:

  • 方案1:用pivot_table替代pivot,提前指定聚合逻辑避免重复值报错,运行内存占用更低
pivot_df = df.pivot_table(
    index='日期',
    columns='ID',
    values='值',
    aggfunc='first', # 如果同一个日期+ID组合有多条记录,取第一条,可按需改为sum/mean等聚合逻辑
    fill_value=None
).rename_axis(columns=None)
  • 方案2:内存仍然不足的情况下,可以直接在数据库层面完成透视转换再拉取数据,大幅降低本地内存压力,SQL示例(以MySQL为例):
SELECT 
    日期,
    MAX(CASE WHEN ID = 'id1' THEN 值 END) AS id1,
    MAX(CASE WHEN ID = 'id2' THEN 值 END) AS id2,
    -- 其余唯一ID按需生成对应规则
FROM 你的原始表名
GROUP BY 日期
ORDER BY 日期;

注意事项

  • 转换前建议先对原始数据做df.drop_duplicates(subset=['ID','日期'])去重,避免同一个日期+ID组合出现多条记录导致转换报错
  • 如果ID数量极多(超过1万),转换后的宽表会占用非常大的内存,建议先过滤掉不需要的ID再做转换

内容的提问来源于stack exchange,提问作者Afaeld

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 10:18:00