如何基于两列表头值向Pandas插入可复用的百分比差异列
可复用的成绩对比差异列生成方案
思路
先自动找出合并后带_1、_2后缀的科目列对,给每一对计算百分比差异,然后把差异列插到对应科目两列的后面,同时保留Name这类固定列的位置,不管以后加多少固定列或者新科目,都不用改代码。
代码实现
import pandas as pd # 模拟测试数据 df_1 = pd.DataFrame({'Name': ['张三', '李四'], 'Math': [80, 90], 'English': [75, 85]}) df_2 = pd.DataFrame({'Name': ['张三', '李四'], 'Math': [85, 88], 'English': [80, 82]}) # 合并成对比表 merged_df = pd.merge(df_1, df_2, on='Name', suffixes=('_1', '_2')) def add_diff_columns(df, suffixes=('_1', '_2')): # 自动提取所有科目的前缀(排除固定列) subject_prefixes = set(col.rsplit('_', 1)[0] for col in df.columns if suffixes[0] in col) # 构建新的列顺序 new_col_order = [] for col in df.columns: new_col_order.append(col) # 遇到_1后缀的科目列,就插入对应的差异列 if col.endswith(suffixes[0]): subject = col.rsplit('_', 1)[0] col_2 = f"{subject}{suffixes[1]}" # 计算百分比差异:((新成绩-旧成绩)/旧成绩)*100,处理除数为0的情况 df[f"{subject}_diff_pct"] = ((df[col_2] - df[col]) / df[col].replace(0, pd.NA)) * 100 new_col_order.append(f"{subject}_diff_pct") # 重新排列列,返回结果 return df[new_col_order] # 生成最终结果 result_df = add_diff_columns(merged_df) print(result_df)
说明
- 自动识别科目:靠后缀
_1找所有科目,不用手动列科目名,以后加新科目或者新固定列都能适配。 - 避免除以0报错:把成绩为0的情况替换成缺失值,防止计算时出错。
- 列顺序不乱:遍历原列的时候,每遇到一个
_1列就马上插差异列,保证科目列、对比列、差异列是挨在一起的,看着清楚。 - 灵活适配:函数支持自定义后缀,只要合并时用的后缀和函数参数一致就行,通用性强。
内容的提问来源于stack exchange,提问作者yss
相关产品推荐
相关产品推荐

