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

如何实现DataFrame中除索引列外所有列与'0'列做差并生成新列

问题描述

有如下结构的DataFrame:

Index1 Index2  -2  -1   0   1   2
0      A      W  20  25  28  29  18
1      B      X  21  20  26  21  27
2      C      Y  19  19  20  17  17
3      D      Z  18  17  15  18  18

需求是将除Index1、Index2之外的所有列减去0列,生成带 ph后缀的新列。手动指定列的方式已实现,但非索引列可能动态变化,需要通用代码。此前尝试的df = df.assign(**df[~['Index1','Index2']].sub(df['0'], axis=0).add_suffix(' ph'))无法成功,寻求正确方案。

解决方案

核心思路是先动态筛选出目标列(排除Index1、Index2的所有列),再对这些列执行减法操作,最后将结果合并回原DataFrame。以下是几种可行的实现方式:

方法一:用列名差集筛选

通过df.columns.difference()自动获取排除指定列后的所有列,适配列的动态变化:

import pandas as pd

# 创建示例DataFrame
data = {'Index1': ['A', 'B', 'C', 'D'],
        'Index2': ['W', 'X', 'Y', 'Z'],
        '-2': [20, 21, 19, 18],
        '-1': [25, 20, 19, 17],
        '0': [28, 26, 20, 15],
        '1': [29, 21, 17, 18],
        '2': [18, 27, 17, 18]
        }
df = pd.DataFrame(data)

# 动态筛选目标列
target_cols = df.columns.difference(['Index1', 'Index2'])
# 计算差值、添加后缀后合并到原DataFrame
df = pd.concat([df, df[target_cols].sub(df['0'], axis=0).add_suffix(' ph')], axis=1)

print(df)

方法二:用drop方法排除列

通过drop移除不需要的列,直接得到目标列子集:

# 排除索引列,得到数值列子集
target_df = df.drop(['Index1', 'Index2'], axis=1)
# 计算差值并合并
df = pd.concat([df, target_df.sub(df['0'], axis=0).add_suffix(' ph')], axis=1)

方法三:改进assign写法

如果偏好使用assign,可将计算结果转为字典传入:

target_cols = df.columns.difference(['Index1', 'Index2'])
diff_df = df[target_cols].sub(df['0'], axis=0).add_suffix(' ph')
df = df.assign(**diff_df.to_dict('series'))

运行结果

执行上述代码后,会生成包含差值列的DataFrame:

Index1 Index2  -2  -1   0   1   2  -1 ph  -2 ph  0 ph  1 ph  2 ph
0      A      W  20  25  28  29  18     -3     -8     0     1   -10
1      B      X  21  20  26  21  27     -6     -5     0    -5     1
2      C      Y  19  19  20  17  17     -1     -1     0    -3    -3
3      D      Z  18  17  15  18  18      2      3     0     3     3

关键说明

  • df.columns.difference()会自动返回除指定列外的所有列名,无需手动维护列列表;
  • sub(df['0'], axis=0)确保按行对每个列减去0列的对应值;
  • add_suffix(' ph')为新生成的差值列添加统一后缀;
  • pd.concat或assign均可完成新列与原DataFrame的合并,按需选择即可。

内容的提问来源于stack exchange,提问作者z star

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 04:45:25