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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 22:10:11