gpt4 book ai didi

python - 在python中优化for循环

转载 作者:太空宇宙 更新时间:2023-11-03 14:59:31 25 4
gpt4 key购买 nike

我有一个包含行进距离的数据框 (df),并且我根据特定条件分配了一个标签。

distance=[0,0.0001,0.20,1.23,4.0]
df = pd.DataFrame(distance,columns=["distance"])
df['label']=0
for i in range(0, len(df['distance'])):
if (df['distance'].values[i])<=0.10:
df['label'][i]=1
elif (df['distance'].values[i])<=0.50:
df['label'][i]=2
elif (df['distance'].values[i])>0.50:
df['label'][i]=3

这工作正常。但是,我有超过 100 万条距离记录,这个 for 循环花费的时间比预期的要长。我们可以优化此代码以减少执行时间吗?

最佳答案

一般来说,除非绝对必要,否则你不应该遍历 DataFrame。使用已经优化的内置 Pandas 函数或使用矢量化方法,您通常会获得更好的性能。

在这种情况下,您可以使用locBoolean indexing做作业:

# Initialize as 1 (eliminate need to check the first condition).
df['label'] = 1

# Case 1: Between 0.1 and 0.5
df.loc[(df['distance'] > 0.1) & (df['distance'] <= 0.5), 'label'] = 2

# Case 2: Greater than 0.5
df.loc[df['distance'] > 0.5, 'label'] = 3

另一种选择是使用 pd.cut .这是一种更专门针对问题中的示例问题的方法。 bool 索引是一种更通用的方法。

# Get the low and high bins.
low, high = df['distance'].min()-1, df['distance'].max()+1

# Perform the cut. Add one since the labels start at zero by default.
df['label'] = pd.cut(df['distance'], bins=[low, 0.1, 0.5, high], labels=False) + 1

您也可以在上面的代码中使用 labels=[1,2,3],而不是将结果加 1。这会给 df['labels'] 分类数据类型而不是整数数据类型。根据您的用例,这可能重要也可能不重要。

任一方法的结果输出:

   distance  label
0 0.0000 1
1 0.0001 1
2 0.2000 2
3 1.2300 3
4 4.0000 3

关于python - 在python中优化for循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39416026/

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