python - 你将如何优化这个简短但非常慢的 Python 循环?

标签 python pandas loops

我正在从 R 切换到 Python。不幸的是,我发现虽然某些结构在 R 中几乎可以立即运行,但在 Python 中它们需要几秒钟(甚至几分钟)。阅读后我发现 pandas 强烈反对使用 for 循环,建议使用矢量化和应用等其他替代方法。

在此示例代码中:从一列从最小值到最大值排序的值,保留长度为“200”的间隔后排在第一位的所有值。

import numpy as np
import pandas as pd

#Let's create the sample data. It consists of a column with random sorted values, and an extra True/False column, where we will flag the values we want
series = np.random.uniform(1,1000000,100000)
test = [True]*100000
data = pd.DataFrame({'series' : series, 'test':test })
data.sort_values(by=['series'], inplace=True)

#Loop to get rid of the next values that fall within the '200' threshold after the first next valid value
for i in data['series']:
    if data.loc[data['series'] == i,'test'].item() == True:
        data.loc[(data['series'] > i) & (data['series'] <= i+200  ) ,'test' ] = False
#Finally, let's keep the first values after any'200' threshold             
data = data.loc[data['test']==True , 'series']

是否可以将其转换为函数、矢量化、应用或除“for”循环之外的任何其他结构以使其几乎立即运行?

最佳答案

这是我使用 while 循环的方法:

head = 0
indexes = []
while head < len(data):
    thresh = data['series'].iloc[head] + 200
    indexes.append(head)
    head += 1
    while head < len(data) and data['series'].iloc[head] < thresh:
        head+=1

# output:
data = data.iloc[indexes]

# double check with your approach
set(data.loc[data['test']].index) == set(data.iloc[indexes].index)
# output: True

上述方法耗时 984 毫秒,而您的方法耗时 56 秒。

关于python - 你将如何优化这个简短但非常慢的 Python 循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59740430/

相关文章:

Python 元类与类装饰器

python - 将任意函数与 MyPy 的 TypeVar 绑定(bind)属性一起使用

python - pandas - 根据数据框分组创建键值对

python - 读取一个单词并打印所有子字符串,在 Python 中按长度排序

python - 检查 for 循环变量是否驻留在列表的两个索引处

python - pip升级后无法安装numpy

python pandas groupby/应用 : what exactly is passed to the apply function?

python - 有没有更好的方法来提高连接速度?

python - Pandas 错误 : __setitem__() doesnt recognize dictionary values as a list of column names

python在没有for循环的sql语句中列出list的值