Python Pandas多列对比:基于上一行最大值选取对应列方案问询
实现思路指导
存储方案选择
优先将数据整合为单个DataFrame存储,统一使用前缀+1/2的列名格式(如A1、A2、B1、B2),相比多独立DataFrame存储无需额外处理跨表索引对齐,逻辑更简洁,性能更好。
方案1:贴合现有循环框架的实现
核心逻辑是在循环内先取上一行所有后缀为1的列的最大值对应列,再映射到当前行的后缀为2的列取值:
import pandas as pd # 提前生成列映射关系 cols_1 = [col for col in df.columns if col.endswith('1')] col_1_to_2 = {c: c[:-1] + '2' for c in cols_1} df_results = [] for i in range(1, len(df.index)): # 取上一行所有后缀为1的列的值 prev_row_vals = df.loc[i-1, cols_1] # 找到最大值对应的列名 max_col_1 = prev_row_vals.idxmax() # 取当前行对应后缀为2的列的值 current_result = df.loc[i, col_1_to_2[max_col_1]] df_results.append(current_result) # 写入原表新列D,第一行无上游数据填充空值,可按需求修改默认值 df['D'] = [pd.NA] + df_results
方案2:Pandas向量化高效实现(适合数据量较大场景)
无需逐行循环,利用shift方法对齐上一行数据,性能比循环实现高1~2个数量级:
import pandas as pd cols_1 = [col for col in df.columns if col.endswith('1')] col_1_to_2 = {c: c[:-1] + '2' for c in cols_1} # 将所有后缀为1的列上移一行,对齐到当前行 prev_1_cols = df[cols_1].shift(1) # 逐行计算最大值对应的列 max_col_1 = prev_1_cols.idxmax(axis=1) # 映射到对应后缀为2的列取值 df['D'] = df.rename(columns=col_1_to_2).lookup(max_col_1.index, max_col_1.map(col_1_to_2))
多独立DataFrame兼容处理
如果你坚持使用多个独立DataFrame存储,先做一步数据合并即可复用上述逻辑:
- 对每个独立df的列名增加前缀标识,如
df_a的column_1/column_2重命名为A1/A2 - 按索引拼接所有df为单个大表,后续逻辑和上述实现完全一致
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

