如何从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
相关产品推荐
相关产品推荐

