如何通过遍历DataFrame行实现变量单调趋势判定并输出指定格式?
解决DataFrame行级变量单调趋势判断问题
核心问题分析
你需要对DataFrame的**每一行(对应单个变量的序列值)**判断其单调趋势,之前的is_monotonic_increasing/is_monotonic_decreasing是列级属性,无法直接适配行级判断;apply未成功大概率是逻辑未覆盖重复值、趋势分类不全等问题。
解决方案代码
1. 构造示例数据(模拟你的数据格式)
假设每行是一个变量,列是时间/观测顺序:
import pandas as pd df = pd.DataFrame({ 'obs1': [1, 3, 2], 'obs2': [2, 4, 5], 'obs3': [3, 5, 3], 'obs4': [4, 6, 1] }, index=['var_A', 'var_B', 'var_C'])
2. 自定义趋势判断函数
针对单行序列,区分严格单调(无重复值)和非严格单调(允许重复)两种场景:
严格单调判断(无重复值)
def judge_strict_monotonic(row): # 去重避免重复值干扰严格单调判断 unique_vals = row.drop_duplicates().tolist() if len(unique_vals) == 1: return 'constant' # 严格递增 if all(unique_vals[i] < unique_vals[i+1] for i in range(len(unique_vals)-1)): return 'strictly_increasing' # 严格递减 if all(unique_vals[i] > unique_vals[i+1] for i in range(len(unique_vals)-1)): return 'strictly_decreasing' # 非单调 return 'non_monotonic'
非严格单调判断(允许重复)
def judge_non_strict_monotonic(row): # 非严格递增(允许相等) if all(row[i] <= row[i+1] for i in range(len(row)-1)): return 'non_strictly_increasing' # 非严格递减(允许相等) if all(row[i] >= row[i+1] for i in range(len(row)-1)): return 'non_strictly_decreasing' return 'non_monotonic'
3. 按行应用函数并输出结果
# 应用严格单调判断 df['strict_trend'] = df.apply(judge_strict_monotonic, axis=1) # 应用非严格单调判断(可选) df['non_strict_trend'] = df.apply(judge_non_strict_monotonic, axis=1) print(df)
输出结果示例:
obs1 obs2 obs3 obs4 strict_trend non_strict_trend var_A 1 2 3 4 strictly_increasing non_strictly_increasing var_B 3 4 5 6 strictly_increasing non_strictly_increasing var_C 2 5 3 1 non_monotonic non_monotonic
为什么之前的方法失效?
is_monotonic_increasing/is_monotonic_decreasing是列对象的属性,默认仅能判断列方向的单调性,若强行转置使用,也只能得到布尔值,无法输出你需要的分类格式。- 使用
apply时如果未处理重复值、未覆盖常量/非单调等场景,会导致判断逻辑不完整,无法得到正确结果。
内容的提问来源于stack exchange,提问作者KMM
相关产品推荐
相关产品推荐

