gpt4 book ai didi

python - 对于给定的 pandas 列,是否有一种更快的方法来检查数据条目的符号是否与前一行中数据条目的符号不同?

转载 作者:行者123 更新时间:2023-12-02 00:59:40 26 4
gpt4 key购买 nike

我试图找出“Delta”列中的数据条目在固定行数内改变符号(从正到负,反之亦然)的次数

这是我正在处理的数据框的小样本以及我迄今为止尝试过的方法:

import pandas as pd 
df = pd.DataFrame({'id': [0,1,2,3,4,5], 'Delta':[1,2,-3,4,5,-7]})

j=1
step=4
for i in range(1,df.shape[0]):
if j<df.shape[0]-3:
for j in range(j,j+3):
df['Spike'].iloc[j]=(df['Delta'].iloc[i]>0)-(df['Delta'].iloc[i-1]>0)
j=j+step

for j 循环的目的是在给定的固定行数上执行“符号更改检查”。

所需的输出为 3,因为“Delta”列中的值已更改符号 3 次

不幸的是,这段代码需要花费很多时间。我的猜测是 pandas 逐一检查每一行,从而使整个代码运行速度变慢。由于我想在更大的数据(数百万行)上实现代码,如果有人建议更快的解决方案,我将不胜感激

最佳答案

要检测一行是否与前一行相比改变了符号,可以将它们相乘并检查结果是否小于零。您可以使用Series.shift将条目与其上方的行对齐,以便在单个系列操作中比较它们:

df['Delta'] * df['Delta'].shift() < 0

每次标志发生变化时,这都会返回一个带有 True 的新系列。

现在,为了查找 4 行窗口中符号发生变化的次数,您可以使用 Series.rolling在此派生系列上,然后简单地将条目 sum() 组合在一起(在 sum() 中,True 将为 1,False 将为 0,因此 sum() 将是窗口中 True 的数量。)

df['Spike'] = (df['Delta'] * df['Delta'].shift() < 0).rolling(4).sum()

这似乎与您现在正在做的事情很接近,可能略有不同,因为此代码正在查看过去的条目,而您的代码正在查看 future 的条目(可能是 shift(3) 的另一种用法 或者如果你需要的话可以解决这个问题?)

关于python - 对于给定的 pandas 列,是否有一种更快的方法来检查数据条目的符号是否与前一行中数据条目的符号不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60135795/

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