如何从另一DataFrame提取时段最高值为目标DataFrame新增列赋值?
解决为df2添加区间最高high值列的问题
问题背景
现有两个DataFrame结构如下:
# df1 date open high low close 2022-03-01 11 33 5 22 2022-03-02 12 34 6 23 2022-03-03 13 35 7 24 2022-03-04 14 36 8 25 2022-03-05 15 37 9 26 2022-03-06 16 38 10 27 ...... # df2 date close 2022-03-01 22 2022-03-04 25 2022-03-06 27 ......
需求:为df2新增high列,每一行的high值为df1中从起始日期到该行日期区间内的最高high值。例如df2中2022-03-04对应的区间是2022-03-01至2022-03-04,该区间最高high为36,因此该行df2['high']应为36。
尝试过的无效代码
joined_df = df1.join(df2, how='inner') high_values = joined_df.groupby(joined_df.index)['high'].max() df2['high'] = df1.index.map(high_values)
解决方案
你的思路问题在于没有正确计算区间累计最大值,而是做了简单的合并和分组,以下是正确的实现步骤:
- 确保日期列是datetime类型(避免字符串排序问题):
import pandas as pd df1['date'] = pd.to_datetime(df1['date']) df2['date'] = pd.to_datetime(df2['date'])
- 为df1计算从起始日到每个日期的累计最高
high值:
df1['cum_high'] = df1['high'].cummax()
cummax()会逐行计算到当前行为止的最大值,正好符合"从起始到当前日期区间最高值"的需求。
- 将df2与df1的日期、累计最高值列合并,保留df2的所有行:
df2 = df2.merge(df1[['date', 'cum_high']], on='date', how='left').rename(columns={'cum_high': 'high'})
执行后df2的结果如下:
date close high 2022-03-01 22 33 2022-03-04 25 36 2022-03-06 27 38
内容的提问来源于stack exchange,提问作者rusty_nakata
相关产品推荐
相关产品推荐

