gpt4 book ai didi

python - 在 python 中以有效的方式对每一行应用条件时,如何在数据框中找到最后一个真值索引?

转载 作者:行者123 更新时间:2023-12-05 03:28:37 25 4
gpt4 key购买 nike

假设我有一个包含两列的 pandas 数据框,previouscurrent。我们可以假设值是非递减的,并且当前值总是大于先前值。

现在,对于 previous 列中的每个元素,我想查找小于该值的 current 列的最后一个值的索引。然后我想从 this 元素的索引中减去该索引并将该值存储在新列中,比如 numIndexes

有效但低效的代码如下:

df = pd.DataFrame({'previous': [1,3,5,7,9,11,13,17],'current': [2,6,9,10,15,19,20,21]})
df['numIndexes']=1
for i in range(len(df)):
x=df['previous'][i]>df['current']
df['numIndexes'][i]=i-x[::-1].idxmax()

OUTPUT
previous current numIndexes
0 1 2 -7
1 3 6 1
2 5 9 2
3 7 10 2
4 9 15 3
5 11 19 2
6 13 20 3
7 17 21 3

忽略第一个负值。

为了通过上面的示例解释我的目标,对于第 5 个索引,我们的先前值为 11。现在在当前列中,当前值小于 11 的最后一个索引是索引 3。这使我第 5 行的 numIndexes 为 2 (5-3)

对于大型数据集,此方法非常慢。感谢任何有助于加快此逻辑的帮助。

编辑:严格增加值的假设是不正确的。值是非递减的。但是,每个先前的值都严格小于其对应的当前值

最佳答案

由于值是非递减的,您可以使用 numpy.broadcasting,[:, None] 将当前值与所有先前值进行比较。然后我们求和并减去 1,因为计数从 0 开始,给我们最后一行的索引位置,当前值 < DataFrame 中所有行的前一个值。

然后创建您的列,即索引减去该计算行的索引。

ilocs = (df['current'].to_numpy()[:, None] < df['previous'].to_numpy()).sum(0) - 1
df['numIndexes'] = df.index - df.index[ilocs]

previous current numIndexes
0 1 2 -7
1 3 6 1
2 5 9 2
3 7 10 2
4 9 15 3
5 11 19 2
6 13 20 3
7 17 21 3

以上是内存密集型的。如果这不起作用,您可以使用 asof 合并来匹配最后一行的当前值 < 先前值。我们带来了索引,这样您就可以在之后执行减法。为了便于说明,我保留了显示它匹配的值和它匹配的索引的附加列 - 如果您不在乎,请删除它们。

import pandas as pd

df = pd.merge_asof(df, df[['current']].reset_index(),
left_on='previous', right_on='current',
suffixes=['', '_match'],
allow_exact_matches=False # Require strictly less than
)

df['numIndexes'] = df.index - df['index']

previous current index current_match numIndexes
0 1 2 NaN NaN NaN
1 3 6 0.0 2.0 1.0
2 5 9 0.0 2.0 2.0
3 7 10 1.0 6.0 2.0
4 9 15 1.0 6.0 3.0
5 11 19 3.0 10.0 2.0
6 13 20 3.0 10.0 3.0
7 17 21 4.0 15.0 3.0

关于python - 在 python 中以有效的方式对每一行应用条件时,如何在数据框中找到最后一个真值索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71223050/

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