在python中优化for循环

在python中优化for循环,python,pandas,for-loop,optimization,Python,Pandas,For Loop,Optimization,我有一个数据帧(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

我有一个数据帧(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
距离=[0,0.0001,0.20,1.23,4.0] df=pd.DataFrame(距离,列=[“距离”]) df['label']=0 对于范围内的i(0,len(df['distance']):
如果(df['distance'].values[i])附带了关于在切片副本上设置值的警告,但也许有人可以建议一个更干净的替代方案

只需基于奇特的索引来获取基于距离的子数组,然后写入想要的值即可

df.loc[:, "label"][df.loc[:, "distance"] <= 0.1] = 1
df.loc[:, "label"][(0.1 < df.loc[:, "distance"]) & (df.loc[:, "distance"] <= 0.5)] = 2
df.loc[:, "label"][df.loc[:, "distance"] > 0.5] = 3

df.loc[:,“label”][df.loc[:,“distance”]一般来说,除非绝对必要,否则不应该在数据帧上循环。使用已经优化过的内置函数,或者使用矢量化方法,通常可以获得更好的性能

在这种情况下,您可以使用
loc
并执行以下分配:

# 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
您还可以在上面的代码中使用
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
通过将标签指定给垃圾箱使用:

pd.cut(df.distance, [-np.inf, 0.1, 0.5, np.inf], labels=[1,2,3])

0    1
1    1
2    2
3    3
4    3

我想如果最后一个
elif…
变成了一个
的话,你可以减少微秒,否则:
你的第二个elif应该是b
0.10df['label',das
df['label'][i]=1
如何不产生错误
0
?并且:不知道您使用的是python2还是python3-但是foor python2将
range
替换为
xrange
pd.cut(df.distance, [-np.inf, 0.1, 0.5, np.inf], labels=[1,2,3])

0    1
1    1
2    2
3    3
4    3