Pandas DataFrame去除连续重复值并判断序列升降趋势的实现方案
方案问题分析
- 缺失核心的连续去重逻辑:原需求明确要求先移除连续重复值,现有代码完全未实现该步骤,连续相等的数值会被判定为不符合递增/递减要求,直接导致最终趋势判断错误。
- 占比计算逻辑错误:diff序列的第一个值为NaN,有效差值的总数是序列长度减1,同时未考虑去重后序列长度会变化,用原始df长度作为分母计算占比完全不准确。
- 存在同时输出两个结果的异常可能:现有代码的判断逻辑没有互斥处理,极端场景下会同时打印
increasing和decreasing两个结果。 - 未处理边界场景:当原始序列长度<2、或者去重后序列长度<2时,没有足够的变化数据做判断,现有代码会出现不符合预期的判定结果。
优化方案
优化点说明
- 先完成连续重复值移除,使用pandas的
ne()方法快速筛选出和前一个值不相等的元素 - 新增边界场景处理,去重后序列长度小于2时直接判定为平稳
- 调整占比计算逻辑,用有效差值的总数作为分母,判断逻辑更直观不易出错
- 调整判断为互斥逻辑,避免同时输出多个结果
优化后代码
import pandas as pd def judge_trend(series): # 移除连续重复值 dedup_series = series.loc[series.ne(series.shift())] # 边界情况处理:无足够变化数据直接判定平稳 if len(dedup_series) < 2: return "more or less constant" # 计算有效差值 diff = dedup_series.diff().dropna() valid_count = len(diff) # 计算递增/递减占比 inc_ratio = (diff > 0).sum() / valid_count dec_ratio = (diff < 0).sum() / valid_count if inc_ratio >= 0.8: return "increasing" elif dec_ratio >= 0.8: return "decreasing" else: return "more or less constant" # 测试调用 df = pd.DataFrame([1,2,3,5,5,6,7,7,5]) print(judge_trend(df[0]))
内容的提问来源于stack exchange,提问作者AchillesDay
相关产品推荐
相关产品推荐

