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