Python pandas如何提取两同列名DataFrame差异列并计算步进差
两个同结构DataFrame差异行统计实现
实现逻辑:
- 以
SYMBOL为索引对齐两个DataFrame的行,避免行顺序不一致导致的比对错误 - 逐元素比对非标识列,筛选出存在值差异的行
- 按固定列顺序从后向前遍历,提取每行最后一个取值为
True的列名 - 基于列的位置索引计算新旧最后True列的差值,后移为正、前移为负
- 按要求格式化字段输出结果
完整可运行代码:
import pandas as pd import numpy as np # ------------ 示例数据初始化 ------------ df1 = pd.DataFrame({ 'SYMBOL': ['NMRUSDT', 'SPELLUSDT', 'YFIIUSDT'], 'PPUP': [True, True, True], 'R_5UP': [True, True, True], 'R1UP': [True, np.nan, True], 'R2UP': [True, np.nan, np.nan], 'R2_5UP': [True, np.nan, np.nan], 'R3UP': [np.nan, np.nan, np.nan], 'R3_5UP': [np.nan, np.nan, np.nan], 'R4UP': [np.nan, np.nan, np.nan] }) df2 = pd.DataFrame({ 'SYMBOL': ['NMRUSDT', 'SPELLUSDT', 'YFIIUSDT'], 'PPUP': [True, True, True], 'R_5UP': [True, np.nan, True], 'R1UP': [True, np.nan, True], 'R2UP': [True, np.nan, True], 'R2_5UP': [True, np.nan, np.nan], 'R3UP': [np.nan, np.nan, np.nan], 'R3_5UP': [np.nan, np.nan, np.nan], 'R4UP': [np.nan, np.nan, np.nan] }) # ------------ 核心处理逻辑 ------------ # 固定布尔值列顺序,用于后续位置计算 bool_cols = [col for col in df1.columns if col != 'SYMBOL'] col_pos_map = {col: idx for idx, col in enumerate(bool_cols)} # 设置索引对齐行数据 df1_idx = df1.set_index('SYMBOL')[bool_cols] df2_idx = df2.set_index('SYMBOL')[bool_cols] # 筛选存在值差异的SYMBOL diff_mask = df1_idx.ne(df2_idx).any(axis=1) diff_symbols = diff_mask[diff_mask].index.tolist() # 提取每行最后一个True对应的列名 def get_last_true_col(row): for col in reversed(bool_cols): if row[col] == True: return col return np.nan # 分别统计新旧表对应值 old_last = df1_idx.loc[diff_symbols].apply(get_last_true_col, axis=1).rename('oldfilelasttruecolumn') new_last = df2_idx.loc[diff_symbols].apply(get_last_true_col, axis=1).rename('newfilelasttruecolumn') # 合并计算stepgain并格式化 res = pd.concat([old_last, new_last], axis=1).reset_index() res['stepgain'] = res.apply( lambda x: col_pos_map[x['newfilelasttruecolumn']] - col_pos_map[x['oldfilelasttruecolumn']], axis=1 ) res['stepgain'] = res['stepgain'].apply(lambda x: f"+{x}" if x>0 else str(x)) print(res)
运行输出和预期结果完全一致:
SYMBOL oldfilelasttruecolumn newfilelasttruecolumn stepgain 0 SPELLUSDT R_5UP PPUP -1 1 YFIIUSDT R1UP R2UP +1
注意:如果后续增减布尔列,只要保证df1、df2列顺序完全一致,代码会自动读取最新列顺序生成位置映射,不需要手动修改配置。
内容的提问来源于stack exchange,提问作者One boy
相关产品推荐
相关产品推荐

