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

如何在Pandas DataFrame指定列的行中获取第二大值

获取DataFrame指定列每行的第二大值

嘿,这问题我熟!你已经知道怎么用max(axis=1)获取每行最大值了,要拿第二大值其实也很简单,用pandas的nlargest函数就能轻松搞定,下面给你几种实用的方法:

方法一:用nlargest直接取第二大值

这是最直观的方式,nlargest(n)会返回每行前n个最大的元素,我们取第2个(索引为1,因为从0开始计数)就行:

# 针对你指定的移动平均线列,计算每行第二大值
df2['2nd_Largest'] = df2[['10D_MA','30D_MA','50D_MA','100D_MA','200D_MA']].apply(lambda x: x.nlargest(2).iloc[1], axis=1)

方法二:排序后取第二大值

如果你更习惯排序的思路,也可以先把每行的值从大到小排序,再取第二个元素:

df2['2nd_Largest'] = df2[['10D_MA','30D_MA','50D_MA','100D_MA','200D_MA']].apply(lambda x: x.sort_values(ascending=False).iloc[1], axis=1)

特殊情况处理:严格第二大(排除重复最大值)

如果你的数据里存在多个相同的最大值(比如某行有两个70.89),上面的方法会返回最大值本身。如果需要严格意义上的第二大值(即排除重复的最大值),可以先对每行去重再操作:

# 处理重复值的情况,确保取到的是不同的第二大值
df2['2nd_Largest_Strict'] = df2[['10D_MA','30D_MA','50D_MA','100D_MA','200D_MA']].apply(
    lambda x: x.drop_duplicates().nlargest(2).iloc[1] if len(x.drop_duplicates()) >= 2 else x.max(),
    axis=1
)

这里加了个判断:如果去重后剩下的元素不足2个(比如所有值都一样),就直接返回最大值,避免报错。

拿你给出的示例数据测试的话,第一行指定列的第二大值就是69.37,第二行是69.47,第三行是69.57,完全符合预期~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:37:29