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

