Python/for循环。。为什么我的速度这么慢?

Python/for循环。。为什么我的速度这么慢?,python,pandas,jupyter,Python,Pandas,Jupyter,所以我对python、jupyter环境和熊猫都是新手 我已经涉猎了一点MATLAB,这就是为什么我开始学习Jupyter、python和它的pandas库 我已经为一些数据处理建立了一个170万x9的大数据框 如果150毫秒150行出现错误,我需要检测一个错误,在MATLAB中,我可以合理地快速执行此操作~几秒钟,但在python中,以下循环可能需要一个小时+我没有耐心完成,并且对我来说,我的代码有问题 我希望输出的数据与输入的数据相同,另外还有一列,默认为0,如果TrqSpdQuadrant

所以我对python、jupyter环境和熊猫都是新手

我已经涉猎了一点MATLAB,这就是为什么我开始学习Jupyter、python和它的pandas库

我已经为一些数据处理建立了一个170万x9的大数据框

如果150毫秒150行出现错误,我需要检测一个错误,在MATLAB中,我可以合理地快速执行此操作~几秒钟,但在python中,以下循环可能需要一个小时+我没有耐心完成,并且对我来说,我的代码有问题

我希望输出的数据与输入的数据相同,另外还有一列,默认为0,如果TrqSpdQuadrant!=UdUq_IQRS150行的象限

PosSpdData['Fault'] = 0
pd.options.mode.chained_assignment = None # The error for rewriting a column was annoying. <- why isn't this correct?
cnt = 0
for i in range(1, len(PosSpdData['Error_IqRs'])):       
    if (PosSpdData['Error_IqRs'].values[i] == 0):  
        cnt += 1
        if cnt > 150:
            PosSpdData['Fault'][i] = 1  
        else:
            PosSpdData['Fault'][i] = 0
    else:
        cnt = 0
        PosSpdData['Fault'][i] = 0

DemandedTorque  Speed   Ud  Uq  Iq  TrqSpdQuadrant  Uq_IqRs     UdUqQuadrant    UdUq_IqRsQuadrant   Error   Error_IqRs
0   0.0     0.0     0.00000     0.00000     0.0000  0   0.000000    0   0   0   0
1   0.0     0.0     0.00000     0.00000     0.0000  0   0.000000    0   0   0   0
2   0.0     0.0     0.00000     0.00000     0.0000  0   0.000000    0   0   0   0
3   0.0     0.0     0.00000     0.00000     0.0000  0   0.000000    0   0   0   0
4   0.0     0.0     0.00000     0.00000     0.0000  0   0.000000    0   0   0   0
...     ...     ...     ...     ...     ...     ...     ...     ...     ...     ...     ...
30302   270.0   847.0   -25.40625   30.75000    461.0625    1   17.162577   1   1   0   0
30303   270.0   847.0   -25.40625   30.75000    463.1875    1   17.099954   1   1   0   0
30304   270.0   847.0   -25.40625   30.75000    463.1875    1   17.099954   1   1   0   0
30305   270.0   847.0   -25.93750   30.75000    463.1875    1   17.099954   1   1   0   0
30306   270.0   847.0   -25.93750   29.34375    463.1875    1   15.693704   1   1   0   0

当n>150个连续行指向错误时,这会将“True”添加到“Fault”列,否则为“False”

PosSpdData['Error_IqRs'] = PosSpdData['TrqSpdQuadrant'] != PosSpdData['UdUq_IqRsQuadrant']
data = PosSpdData['Error_IqRs'].values
PosSpdData['gr'] = np.r_[True, data[1:] != data[:-1]].cumsum()
PosSpdData['Fault'] = PosSpdData.groupby('gr')['Error_IqRs'].transform('sum') > 150
n=2_000_000行x 2列的基准测试

307 ms ± 4.57 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

请提供示例数据,可能使用numpy.random.randint。请记住,MATLAB进行了大量jit编译,这允许您编写迭代代码,而不会造成太多性能损失。numpy和pandas在顶部如果不这样做-它在使用矢量化/整个数组方法时具有最佳性能,就像旧的MATLAB版本一样。您永远不应该使用pandas或numpy进行循环。这将是非常缓慢的。为了帮助您,我们需要您的数据和预期输出的示例。