Pandas实现按Stop列划分动态区间的Price最值计算
解决DataFrame区间分界点的最值计算问题
示例数据集
先构造符合需求的示例DataFrame:
import pandas as pd import numpy as np data = { 'Price': [5, 20, 85, 30, 10, 45, 50, 15], 'Stop': [15, np.nan, np.nan, 30, np.nan, np.nan, np.nan, 15], 'Max': [np.nan] * 8, 'Min': [np.nan] * 8 } df = pd.DataFrame(data)
解决方案步骤
1. 生成区间分组标识
通过向前填充Stop列的空值,为每个区间内的行打上统一的分组标记:
df['group'] = df['Stop'].ffill()
2. 计算各区间的Price最值
按分组标识计算每个区间内Price的最大值和最小值:
group_stats = df.groupby('group')['Price'].agg(['max', 'min'])
3. 将最值映射到对应Stop行
把计算得到的最值合并回原DataFrame,仅填充Stop非空的行:
# 合并统计结果 df = df.merge(group_stats, left_on='group', right_index=True, how='left') # 更新Max、Min列 df.loc[df['Stop'].notna(), ['Max', 'Min']] = df.loc[df['Stop'].notna(), ['max', 'min']] # 清理临时列 df.drop(['group', 'max', 'min'], axis=1, inplace=True)
处理后结果
最终DataFrame如下:
Price Stop Max Min 0 5 15.0 85.0 5.0 1 20 NaN NaN NaN 2 85 NaN NaN NaN 3 30 30.0 50.0 10.0 4 10 NaN NaN NaN 5 45 NaN NaN NaN 6 50 NaN NaN NaN 7 15 15.0 15.0 15.0
关键说明
ffill()方法确保每个区间内的所有行都继承当前的Stop分界点值,实现动态区间的分组。- 分组统计后通过
merge匹配对应区间的最值,精准填充到Stop所在行。
内容的提问来源于stack exchange,提问作者rakesh
相关产品推荐
相关产品推荐

