如何在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
相关产品推荐
相关产品推荐

