我想确定两个长度相等的列表之间的索引,该索引给出每一行之间差的第二个最大绝对值。
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
,所以你可能会得到1
和4
之间的随机答案。
您可以确定与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)
的大小或顺序。