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

Python pandas如何获取两等长序列第二大绝对差值对应索引

实现目标

定位两个等长pandas DataFrame逐行计算差值时,绝对差值第二大的结果对应的行索引。

基准示例

可复现的测试代码如下:

import random
import pandas as pd
random.seed(2)
l1 = pd.DataFrame([random.randrange(100) for _ in range(10)])
l2 = pd.DataFrame([random.randrange(100) for _ in range(10)])

逐行计算差值的输出结果:

0
0 -20
1 -66
2   6
3 -28
4 -66
5  74
6  30
7 -42
8 -18
9 -15

现有方案可以通过idxmax()快速获取最大绝对差值对应的行索引,代码和返回结果如下:

(l1 - l2).abs().idxmax()
0    5
dtype: int64

即最大绝对差值出现在行索引5的位置,对应差值绝对值为74。

获取第二大绝对差值索引的实现方法

注意:本测试样例中第二大的绝对差值为66,同时出现在行索引1和行索引4的位置,以下方法默认返回排序靠前的匹配索引。

方法1:调用nlargest直接取值(写法最简洁)

nlargest(n)可以直接返回序列中最大的n个值,保留原数据的索引顺序,取第2个值的索引即可得到结果:

abs_diff = (l1 - l2).abs()
# 针对单列表取第一列,筛选最大的2个值,取第二个值的索引
second_max_idx = abs_diff.iloc[:, 0].nlargest(2).index[1]
print(second_max_idx)

运行返回结果为1,符合预期。

方法2:排除最大值后二次查找最大值

逻辑为先定位最大差值的位置,将该位置的值临时替换为空值,再对剩余值调用idxmax(),得到的就是全局第二大值的索引:

abs_diff = (l1 - l2).abs()
# 先拿到最大值对应的行索引
max_row_idx = abs_diff.idxmax().iloc[0]
# 临时将最大值位置置为空值
abs_diff.loc[max_row_idx] = pd.NA
# 剩余值的最大值即为全局第二大
second_max_idx = abs_diff.idxmax().iloc[0]
print(second_max_idx)

运行返回结果同样为1。

如果处理的是多列DataFrame,只需要指定目标列或者按列遍历,套用上述逻辑即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 00:51:24