如何为带周期标记的DataFrame生成每行所属周期的高低值列?
为Pandas DataFrame按周期生成高低值列的实现方法
问题背景
现有一个包含波动数值列x和周期标记列cycle的Pandas DataFrame:
- 周期以
x的最低点(cycle列标记为0)起始 x上升至最高点(cycle列标记为1)后回落至最低点,新周期随即开始
示例数据如下:
import pandas as pd import numpy as np x = [1,2,3,4,5,4,3, # cycle 1 2,3,4,5,4,3,2, # cycle 2 1,2,3,4,5,6,5, # cycle 3 4] # cycle 4 points = [0, np.nan, np.nan, np.nan, 1, np.nan, np.nan, # cycle 1 0, np.nan, np.nan, 1, np.nan, np.nan, np.nan, # cycle 2 0, np.nan, np.nan, np.nan, np.nan, 1, np.nan, # cycle 3 0] # cycle 4 df = pd.DataFrame({'x':x, 'cycle':points})
需新增low和high两列,分别标记每行所属周期的高低值:
- 每次
cycle列出现0时周期重置 - 仅含单个数据点的周期,高低值相等
期望结果示例:
low = [1,1,1,1,1,1,1, # cycle 1 2,2,2,2,2,2,2, # cycle 2 1,1,1,1,1,1,1, # cycle 3 4] # cycle 4 high = [5,5,5,5,5,5,5, # cycle 1 5,5,5,5,5,5,5, # cycle 2 6,6,6,6,6,6,6, # cycle 3 4] # cycle 4 new_df = pd.DataFrame({'x':x, 'cycle':points, 'low':low, 'high':high})
解决方案
核心思路是通过cycle列的0值划分周期分组,再对每个分组计算x的最小/最大值,最后映射回原DataFrame。
实现代码
import pandas as pd import numpy as np # 示例数据(可替换为实际数据集) x = [1,2,3,4,5,4,3, # cycle 1 2,3,4,5,4,3,2, # cycle 2 1,2,3,4,5,6,5, # cycle 3 4] # cycle 4 points = [0, np.nan, np.nan, np.nan, 1, np.nan, np.nan, # cycle 1 0, np.nan, np.nan, 1, np.nan, np.nan, np.nan, # cycle 2 0, np.nan, np.nan, np.nan, np.nan, 1, np.nan, # cycle 3 0] # cycle 4 df = pd.DataFrame({'x':x, 'cycle':points}) # 1. 生成周期分组编号:每次cycle为0时开启新分组 df['group'] = df['cycle'].eq(0).cumsum() # 2. 计算每个分组的x最小值(low)和最大值(high) group_stats = df.groupby('group')['x'].agg(['min', 'max']).rename(columns={'min': 'low', 'max': 'high'}) # 3. 将统计结果合并回原DataFrame,删除临时分组列 df = df.merge(group_stats, on='group', how='left').drop(columns='group') # 输出结果验证 print(df)
代码解释
- 生成分组:
df['cycle'].eq(0).cumsum()会对cycle等于0的位置标记为True,累加后得到连续的分组编号,每个编号对应一个完整周期。 - 计算分组统计值:通过
groupby对每个分组计算x的最小和最大值,分别对应周期的低点和高点。 - 合并结果:使用
merge将分组统计的高低值关联到原数据的每一行,自动处理单个数据点的周期(此时min和max相等)。
内容的提问来源于stack exchange,提问作者Bas R
相关产品推荐
相关产品推荐

