查找Python中给出两个列表之间第二大差异的索引



我想确定两个长度相等的列表之间的索引,该索引给出每一行之间差的第二个最大绝对值。

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)])
l1-l2
0
0   -20
1   -66
2   6
3   -28
4   -66
5   74
6   30
7   -42
8   -18
9   -15

现在,我可以用idxmax()来得到给出最大绝对值差值的索引,也就是第5行。我的问题是,我怎样才能得到给出第二大差值的指标?

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

选项1:最简单的方法:排序,然后切片(复杂度O(n log n))

(l1 - l2).abs().sort_values([0], ascending=False).index[1]

选项2:nlargest,然后idxmin(复杂度O(n)):

(l1 - l2).abs().nlargest(2, columns=[0]).idxmin()

注意你的数据实际上有两行值66,所以你可能会得到14之间的随机答案。

您可以确定与idxmax()的最大绝对差异,然后通过其索引将其从列表中删除,并再次使用idxmax(),然后将为您提供第二大绝对差异的索引。

l = (l1 - l2)
largest_index = l.abs().idxmax()
del l[largest_index]
l.idxmax()

由于不太清楚是否需要原始(l1 - l2)中第二大绝对差的索引,此选项将实现此目的。

l = (l1 - l2)
largest_index = l.abs().idxmax()
l[largest_index] = 0
l.idxmax()

通过将最大的绝对差值设置为0,第二次调用将为您提供第二大绝对差值的索引,但不会改变(l1 - l2)的大小或顺序。

最新更新