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

标签 python pandas row

我试图找出“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/

相关文章:

php - 用 div 在自定义 wordpress 循环中包装每 4 个帖子

r - 如何在R中设置行索引名称? (就像 Pandas 中的 DF.index.name)

python - 如何正确组织我的 Flask 项目?

python - 无法在朴素贝叶斯中训练模型

python - pandas 数据框中按升序对组内的行进行编号

python - 计算曼哈顿距离并返回最低的 3 个距离

php - 错误 : ( ! ) 解析错误 : syntax error, 意外 '' (T_ENCAPSED_AND_WHITESPACE),需要标识符 (T_STRING)

python - window Python : Changing encoding using the locale module

python - 尝试运行 crontab 没有成功

pandas - 从excel加载数据时出现python _getitem_和_getitem_column(key)错误