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

Python中带正负标记的DataFrame列归一化处理方法咨询

处理带正负前缀列的DataFrame归一化方法

原始DataFrame结构如下:

RepID  +Col01  +Col02  +Col03  -Col01  +Col04  +Col05  -Col03  -Col04  +Col06  -Col07
1      5       7       9       8       3       8       1       9       4       6
2      1       3       3       3       1       2       2       3       6       0
3      9       8       0       9       4       9       5       1       2       0
4      3       1       0       5       8       7       1       0       9       2
5      0       7       1       2       0       0       2       9       2       1

需求逻辑:对同时存在±前缀的列,计算+列值 - -列值;仅+前缀的列保留原值;仅-前缀的列取负值,最终去掉列名的±前缀。

方法一:分组遍历处理(新手友好)

逻辑清晰,容易理解每一步操作:

import pandas as pd
from collections import defaultdict

# 构造示例DataFrame(实际使用时直接替换为你的df即可)
data = {
    'RepID': [1,2,3,4,5],
    '+Col01': [5,1,9,3,0],
    '+Col02': [7,3,8,1,7],
    '+Col03': [9,3,0,0,1],
    '-Col01': [8,3,9,5,2],
    '+Col04': [3,1,4,8,0],
    '+Col05': [8,2,9,7,0],
    '-Col03': [1,2,5,1,2],
    '-Col04': [9,3,1,0,9],
    '+Col06': [4,6,2,9,2],
    '-Col07': [6,0,0,2,1]
}
df = pd.DataFrame(data)

# 单独提取RepID列,不参与计算
rep_id = df[['RepID']]

# 按核心列名(去掉开头的±)分组
col_groups = defaultdict(list)
for col in df.columns.drop('RepID'):
    core_name = col[1:]
    col_groups[core_name].append(col)

# 对每个分组计算结果:+列加对应值,-列减对应值
processed_cols = []
for core_name, cols in col_groups.items():
    result = pd.Series([0]*len(df), index=df.index)
    for col in cols:
        if col.startswith('+'):
            result += df[col]
        else:
            result -= df[col]
    result.name = core_name
    processed_cols.append(result)

# 合并结果并调整列顺序与目标一致
final_df = pd.concat([rep_id] + processed_cols, axis=1)
final_df = final_df[['RepID', 'Col01', 'Col02', 'Col03', 'Col04', 'Col05', 'Col06', 'Col07']]
print(final_df)

方法二:利用pandas高级操作简化代码(高效简洁)

适合熟悉pandas的用户,代码更紧凑:

import pandas as pd

# 构造示例DataFrame
data = {
    'RepID': [1,2,3,4,5],
    '+Col01': [5,1,9,3,0],
    '+Col02': [7,3,8,1,7],
    '+Col03': [9,3,0,0,1],
    '-Col01': [8,3,9,5,2],
    '+Col04': [3,1,4,8,0],
    '+Col05': [8,2,9,7,0],
    '-Col03': [1,2,5,1,2],
    '-Col04': [9,3,1,0,9],
    '+Col06': [4,6,2,9,2],
    '-Col07': [6,0,0,2,1]
}
df = pd.DataFrame(data)

# 拆分非RepID列的列名为「符号」和「核心名称」
non_rep_cols = df.drop('RepID', axis=1)
non_rep_cols.columns = non_rep_cols.columns.str.extract(r'([+-])(.*)', expand=True)

# 按核心名称分组,将+列值乘1、-列值乘-1后求和,等价于+列减-列
processed = non_rep_cols.stack(level=0).astype(int).mul({'+' : 1, '-' : -1}, level=0).groupby(level=1).sum()

# 合并RepID与处理后的列,调整列顺序
final_df = pd.concat([df['RepID'], processed], axis=1)
final_df = final_df[['RepID', 'Col01', 'Col02', 'Col03', 'Col04', 'Col05', 'Col06', 'Col07']]
print(final_df)

两种方法最终都会得到目标结构:

RepID  Col01  Col02  Col03  Col04  Col05  Col06  Col07
0      1     -3      7      8     -6      8      4     -6
1      2     -2      3      1     -2      2      6      0
2      3      0      8     -5      3      9      2      0
3      4     -2      1     -1      8      7      9     -2
4      5     -2      7     -1     -9      0      2     -1

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 14:23:16