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

基于移位列生成最大值列并处理最后行的最优实现问询

问题描述

现有DataFrame如下:

df = pd.DataFrame(
    {
       'a': [20, 9, 31, 40],
       'b': [1, 10, 17, 30],
    }
)

预期输出为新增列c和name:

a   b   c    name
0  20   1  20    NaN
1   9  10  20    NaN
2  31  17  17    NaN
3  40  30  40    a 

实现步骤要求:

  • a) 初始列c通过df['c'] = np.fmax(df['a'].shift().bfill(), df['b'])生成;
  • b) 最后一行的c值取该行a、b的最大值(因该行a>b,取40);
  • c) 获取最后一行a、b中最大值对应的列名存入name。

我的尝试代码如下:

df['c'] = np.fmax(df['a'].shift().bfill(), df['b'])
df.loc[df.index[-1], 'c'] = df.loc[df.index[-1], ['a', 'b']].max()
df.loc[df.index[-1], 'name'] = df.loc[df.index[-1], ['a', 'b']].idxmax()

请问该实现是否为最简洁/最优的方法?


回答

你的实现逻辑完全正确,能满足所有要求,但可以通过减少重复操作来让代码更简洁高效:

优化方向1:复用最后一行的a、b数据

你两次调用df.loc[df.index[-1], ['a', 'b']],可以先把这部分数据存起来,避免重复索引访问:

import pandas as pd
import numpy as np

df = pd.DataFrame(
    {
       'a': [20, 9, 31, 40],
       'b': [1, 10, 17, 30],
    }
)

df['c'] = np.fmax(df['a'].shift().bfill(), df['b'])
last_ab = df.loc[df.index[-1], ['a', 'b']]
df.loc[df.index[-1], ['c', 'name']] = [last_ab.max(), last_ab.idxmax()]

优化方向2:用iloc提升访问效率

如果DataFrame是默认连续整数索引,用iloc[-1]访问最后一行会比index[-1]更高效:

df['c'] = np.fmax(df['a'].shift().bfill(), df['b'])
last_ab = df.iloc[-1][['a', 'b']]
df.iloc[-1, df.columns.get_loc('c')] = last_ab.max()
df.iloc[-1, df.columns.get_loc('name')] = last_ab.idxmax()

总结

你的原始代码已经完全达标,优化后的版本主要是减少重复计算、提升代码紧凑度。如果数据量较小,原始代码完全够用;如果追求简洁性或处理大数据集,优化版会更合适。

内容的提问来源于stack exchange,提问作者AmirX

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 19:12:53