如何在时间序列股票数据中固定每日首个价格值
问题解决:生成每日初始价格填充列
新手踩坑点
- 分组后没搞懂如何把组内单一值映射回所有行,直接拿分组结果赋值,导致长度不匹配
- 错误用
Time_IDX分组,忽略了DATE才是区分每日数据的唯一键,结果完全偏离需求 - 用全局
loc筛选Time_IDX=1仅得到2行数据,直接往14行的DataFrame里赋值,因长度不匹配报错
可行解决方法
方法1:Groupby + transform(最推荐)
transform的核心作用就是把组内计算结果,对应填充到原DataFrame的每一行,完美适配需求:
import pandas as pd # 构造示例数据 data = { 'DATE': ['2024-01-01']*7 + ['2024-01-02']*7, 'Time_IDX': [1,2,3,4,5,6,7]*2, 'Price': [288,298,301,289,300,287,295,302,305,310,299,300,285,290] } df = pd.DataFrame(data) # 按DATE分组,提取每组Time_IDX=1的Price,用transform映射到所有行 df['Price_0'] = df.groupby('DATE')['Price'].transform(lambda group: group[df.loc[group.index, 'Time_IDX'] == 1].iloc[0])
方法2:分步提取+合并(新手友好)
拆成两步,逻辑更清晰,容易理解:
- 先提取每日Time_IDX=1的价格,作为基准表:
daily_base = df[df['Time_IDX'] == 1][['DATE', 'Price']].rename(columns={'Price': 'Price_0'})
- 将基准表与原DataFrame按
DATE合并,自动为每行填充对应日期的初始价格:
df = df.merge(daily_base, on='DATE', how='left')
方法3:字典映射(简单直观)
先构建「日期→初始价格」的映射字典,再用map完成批量赋值:
# 生成日期到初始价格的映射字典 price_map = df[df['Time_IDX'] == 1].set_index('DATE')['Price'].to_dict() # 按DATE列映射填充新列 df['Price_0'] = df['DATE'].map(price_map)
之前尝试失败的核心原因
- 单独用
groupby('DATE')后直接取Price,得到的是仅2行的分组聚合结果,无法匹配原DataFrame的14行数据 - 错误选择
Time_IDX作为分组键,而Time_IDX是每日重复的标识,分组后会把两天的同一时间点数据归为一组,完全不符合需求 - 设置Time_IDX为索引后,因索引重复,无法区分不同日期的同一Time_IDX,无法精准提取每日的初始价格
内容的提问来源于stack exchange,提问作者T Rhee
相关产品推荐
相关产品推荐

