You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从Pandas DataFrame中提取递增至峰值前的所有值?

提取Pandas DataFrame中递增至峰值前的所有数据

问题描述

有一个Pandas DataFrame,其中的数值先递增到峰值后开始递减,需要提取出停止递增前的所有数据。示例如下:

d = {'values' : [1, 2, 3, 3, 2, 1]}  
df = pd.DataFrame(data=d)

# 期望结果:[1, 2, 3]

错误代码分析

你尝试的两段代码都犯了同一个核心错误:将遍历的列数值当成了DataFrame的索引。

第一段代码问题

result = [i for i in df['values'] if df['values'][i-1] < df['values'][i]]

这里for i in df['values']遍历的是列中的数值(1、2、3、3、2、1),而非索引(0、1、2、3、4、5)。当你用df['values'][i]时,实际是用数值作为位置索引取值,逻辑完全混乱,最终得到错误结果[1, 2, 2, 1]。

第二段代码问题

result = [i for i in df['values'] 
if df['values'].diff().iloc[i]>0 
or np.isnan(df['values'].diff().iloc[i])]

同样的问题:遍历的i是列数值而非索引,diff().iloc[i]用数值作为位置索引取差值,导致判断逻辑错误,结果依然不符合预期。

正确解法

方法1:利用diff()定位首个非递增位置

通过计算相邻元素的差值,找到第一个不再递增(差值≤0)的位置,然后提取该位置之前的所有数据:

import pandas as pd

d = {'values' : [1, 2, 3, 3, 2, 1]}  
df = pd.DataFrame(data=d)

# 计算相邻元素差值,第一个元素为NaN
diff_series = df['values'].diff()
# 筛选出差值≤0的所有索引
non_increase_indices = diff_series[diff_series <= 0].index

# 处理两种情况:存在非递增点/整个序列都是递增的
if len(non_increase_indices) > 0:
    first_non_increase_idx = non_increase_indices[0]
    result = df['values'].iloc[:first_non_increase_idx].tolist()
else:
    result = df['values'].tolist()

print(result)  # 输出:[1, 2, 3]

方法2:利用掩码筛选递增区间

生成掩码标记所有递增的位置,找到首个非递增点后提取数据:

import pandas as pd

d = {'values' : [1, 2, 3, 3, 2, 1]}  
df = pd.DataFrame(data=d)

# 生成掩码:第一个元素为True,后续元素大于前一个则为True
mask = pd.Series([True])
mask = mask._append(df['values'].iloc[1:] > df['values'].iloc[:-1], ignore_index=True)

# 找到首个非递增的位置
first_false_idx = mask[~mask].index[0] if any(~mask) else len(df)
result = df['values'].iloc[:first_false_idx].tolist()

print(result)  # 输出:[1, 2, 3]

内容的提问来源于stack exchange,提问作者Caleb-Stamps

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 17:01:22