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

