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

如何用Pandas高效实现DataFrame逐行列间递变关系判断?

高效实现Pandas逐行相邻列比较的方法

给定目标DataFrame:

id    c1    c3    c5    c7
1     10    11    12    13
2     10    14    11    13
3     15    14    12    10

需求是逐行对比相邻列(c1与c3、c3与c5、c5与c7):严格递减标记1,严格递增标记-1,其余情况标记0。用循环实现效率太低,这里给出更简洁高效的Pandas方案:

步骤1:构造示例数据

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'id': [1,2,3],
    'c1': [10,10,15],
    'c3': [11,14,14],
    'c5': [12,11,12],
    'c7': [13,13,10]
})

步骤2:核心处理逻辑

# 提取需要比较的列(排除id列,也可按列名规则筛选:df.filter(regex='^c\d+$'))
compare_cols = df.columns[1:]

# 计算后列与前列的差值,去掉首列的NaN(无前置列可对比)
diff_vals = df[compare_cols].diff(axis=1).iloc[:, 1:]

# 根据差值映射结果:diff<0(后列<前列,严格递减)→1;diff>0(后列>前列,严格递增)→-1;否则0
result = np.select(
    [diff_vals < 0, diff_vals > 0],
    [1, -1],
    default=0
)

# 给结果列命名,匹配对应对比的列对
result_cols = [f'{col1}_{col2}' for col1, col2 in zip(compare_cols[:-1], compare_cols[1:])]
result_df = pd.DataFrame(result, columns=result_cols)

# 合并原id列与结果,得到最终DataFrame
final_df = pd.concat([df[['id']], result_df], axis=1)

最终输出结果

id  c1_c3  c3_c5  c5_c7
1     -1     -1     -1
2     -1      1     -1
3      1      0      1

说明

  • 利用diff(axis=1)批量计算行内相邻列差值,比循环遍历高效数倍
  • np.select可以快速实现多条件值映射,逻辑清晰且性能优异
  • 若列名规律固定(比如都是c加奇数),用df.filter(regex='^c[1357]$')能更精准筛选目标列,适配不同列位置的情况

内容的提问来源于stack exchange,提问作者Masih Bahmani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 21:06:06