基于移位列生成最大值列并处理最后行的最优实现问询
问题描述
现有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
相关产品推荐
相关产品推荐

