如何在Pandas中批量实现列间相减(无需硬编码)
Pandas批量实现列间相减(首列减常数)
需求场景
需要对DataFrame的多列批量计算差值,规则为:
- 首列与指定常数相减
- 后续每一列与前一列相减
避免硬编码(涉及100列),用Pythonic方式实现。
原始硬编码示例
import pandas as pd df = pd.DataFrame({"a":[1,2,3,4],"b":[1,3,5,6],"c":[6,7,8,9]}) df['a_diff'] = df['a']-16 df['b_diff'] = df['b']-df['a'] df['c_diff'] = df['c']-df['b']
批量处理方案
方案1:向量化操作(高效适合大量列)
利用shift(axis=1)实现列方向偏移,结合批量赋值完成:
import pandas as pd df = pd.DataFrame({"a":[1,2,3,4],"b":[1,3,5,6],"c":[6,7,8,9]}) # 定义首列要减去的常数 const = 16 # 生成差值矩阵:默认用当前列减前一列,再替换首列的计算规则 diff_values = df.sub(df.shift(axis=1), axis=0) diff_values.iloc[:, 0] = df.iloc[:, 0] - const # 重命名差值列 diff_values.columns = [f"{col}_diff" for col in df.columns] # 合并差值列到原DataFrame df = pd.concat([df, diff_values], axis=1)
方案2:循环遍历(逻辑直观)
如果需要更直观的逻辑控制,可通过循环处理每一列:
import pandas as pd df = pd.DataFrame({"a":[1,2,3,4],"b":[1,3,5,6],"c":[6,7,8,9]}) const = 16 # 初始化存储差值的DataFrame diff_cols = pd.DataFrame() # 处理首列 diff_cols[f"{df.columns[0]}_diff"] = df.iloc[:, 0] - const # 批量处理后续列 for idx in range(1, len(df.columns)): current_col = df.columns[idx] prev_col = df.columns[idx-1] diff_cols[f"{current_col}_diff"] = df[current_col] - df[prev_col] # 合并到原表 df = pd.concat([df, diff_cols], axis=1)
说明
shift(axis=1)是列方向偏移的核心,能快速将前一列数据对齐到当前列位置- 向量化操作无需循环,处理100列时效率远高于循环方式
- 两种方案都能自动生成带
_diff后缀的差值列,无需硬编码列名
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

