如何在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
相关产品推荐
相关产品推荐

