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

