gpt4 book ai didi

python - 获取前一个较小值的索引

转载 作者:太空宇宙 更新时间:2023-11-03 12:35:53 25 4
gpt4 key购买 nike

我有一个如下所示的数据框:

index value
0 1
1 1
2 2
3 3
4 2
5 1
6 1

我想要的是让每个值返回前一个较小值的索引,此外,还返回前一个“1”值的索引。如果值为 1 我不需要它们(两个值都可以是 -1 或其他)。

所以我追求的是:

index value  previous_smaller_index  previous_1_index
0 1 -1 -1
1 1 -1 -1
2 2 1 1
3 3 2 1
4 2 1 1
5 1 -1 -1
6 1 -1 -1

我尝试使用滚动、累积函数等,但我无法弄明白。任何帮助将不胜感激!

编辑:SpghttCd 已经为“previous 1”问题提供了一个很好的解决方案。我正在为“以前的小”问题寻找一个不错的 pandas one liner。 (当然,尽管这两个问题都欢迎更好、更高效的解决方案)

最佳答案

  • “previous_smaller_index”可以使用矢量化 numpy 广播比较与 argmax 找到。

  • “previous_1_index”可以在 cumsummed 掩码上使用 groupbyidxmax 来解决。

m = df.value.eq(1)
u = np.triu(df.value.values < df.value[:,None]).argmax(1)
v = m.cumsum()

df['previous_smaller_index'] = np.where(m, -1, len(df) - u - 1)
df['previous_1_index'] = v.groupby(v).transform('idxmax').mask(m, -1)

df
index value previous_smaller_index previous_1_index
0 0 1 -1 -1
1 1 1 -1 -1
2 2 2 1 1
3 3 3 2 1
4 4 2 1 1
5 5 1 -1 -1
6 6 1 -1 -1

如果你想把这些作为一个衬里,你可以把几行揉成一行:

m = df.value.eq(1)
df['previous_smaller_index'] = np.where(
m, -1, len(df) - np.triu(df.value.values < df.value[:,None]).argmax(1) - 1
)[::-1]

# Optimizing @SpghttCd's `previous_1_index` calculation a bit
df['previous_1_index'] = (np.where(
m, -1, df.index.where(m).to_series(index=df.index).ffill(downcast='infer'))
)

df

index value previous_1_index previous_smaller_index
0 0 1 -1 -1
1 1 1 -1 -1
2 2 2 1 1
3 3 3 1 2
4 4 2 1 1
5 5 1 -1 -1
6 6 1 -1 -1

整体表现

设置和性能基准测试是使用 perfplot 完成的。代码可以在 this gist 找到.

enter image description here

时间是相对的(y 尺度是对数的)。


previous_1_index 性能

Gist with relevant code.

enter image description here

关于python - 获取前一个较小值的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54190261/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com