Python 如何在数据帧中创建显示上次记录峰值的列?
我正在尝试创建一个新的列,该列将列出上次记录的峰值,直到出现下一个峰值。例如,假设这是我现有的数据帧:Python 如何在数据帧中创建显示上次记录峰值的列?,python,pandas,scipy,Python,Pandas,Scipy,我正在尝试创建一个新的列,该列将列出上次记录的峰值,直到出现下一个峰值。例如,假设这是我现有的数据帧: index values 0 10 1 20 2 15 3 17 4 15 5 22 6 20 我想得到这样的东西: index values last_recorded_peak 0 10 10 1 20 20 2 15 20 3 17
index values
0 10
1 20
2 15
3 17
4 15
5 22
6 20
我想得到这样的东西:
index values last_recorded_peak
0 10 10
1 20 20
2 15 20
3 17 17
4 15 17
5 22 22
6 20 22
到目前为止,我已经尝试了np.max.acculate,它“累积”了最大值,但不完全是“峰值”(有些峰值可能低于最大值)
我还尝试了使用scipy.signal.find_peaks,它返回一个索引数组,在我的峰值所在的位置(在示例中,索引1、3、5),这不是我想要的
我是一个比较新的编码,任何指针都非常感谢 你走在正确的轨道上,这就是我要走的路,你只需要从结果中做一点工作:
from scipy import signal
peaks = signal.find_peaks(df['values'])[0]
df['last_recorded_peak'] = (df.assign(last_recorded_peak=float('nan'))
.last_recorded_peak
.combine_first(df.loc[peaks,'values'])
.ffill()
.combine_first(df['values']))
如果我正确理解你的意思,那么你正在寻找: 注意:对于示例数据帧,您可能需要使用我在
2
上设置的窗口大小
输出
values last_recorded_peak
0 10 10.0
1 20 20.0
2 15 20.0
3 17 17.0
4 15 17.0
5 22 22.0
6 20 22.0
第3行变回17这一事实的逻辑是什么?索引3中17处的值“峰值”。。指数2和指数4给出了15,这使得指数3成为价值序列中的峰值。我查阅了关于“滚动”的信息,但我的峰值可能没有以特定的间隔整齐地隔开,但还是要感谢!欢迎@qwerty123别忘了你可以投票和接受答案,看看你是否可以对本节中的所有组件做一个简单的解释:(df.assign(last_recorded_peak=float('nan')).last_recorded_peak.combined_first(df.loc[peaks,'values')).ffill().combine_first(df['values'])“部分。我感觉您首先将新创建的列中的所有值指定给'NaN',然后在'peaks'所在的'values'中填充'values',但最后一部分除外。ffill().combine_first(df['values'])“我似乎无法理解,combine_first
是一种在存在NaN(匹配索引)的列中添加值的简单方法。因此第一个是从df.loc[peaks,'values']
分配值。你会看到南边和相应的山峰。然后你向前填充。初始值(在第一个峰值之前)仍为NaN。这就是剩余联合收割机的用途(首先:)@qwerty123
df['last_recorded_peak'] = df['values'].rolling(2).max().fillna(df['values'])
values last_recorded_peak
0 10 10.0
1 20 20.0
2 15 20.0
3 17 17.0
4 15 17.0
5 22 22.0
6 20 22.0