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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 21:39:04