我试图通过这个循环创建一个票价区间 (1/2/3),但它似乎不起作用
traindf['FareBand'] = np.nan
for index, row in traindf.iterrows():
if row['Fare'] <= 13.675550:
row['FareBand'] = 1
elif row['Fare'] <= 20.662183 and row['Fare'] > 13.675550:
row['FareBand'] = 2
else:
row['FareBand'] = 3
运行 .head() 将显示我在 fareband 列下的所有行都是 NaN
traindf.head(20)
Output:
0 NaN
1 NaN
2 NaN
3 NaN
...
12 NaN
13 NaN
14 NaN
15 NaN
16 NaN
17 NaN
18 NaN
19 NaN
Name: FareBand, dtype: float64
可能是什么原因?
请您参考如下方法:
我建议使用 numpy.select :
traindf = pd.DataFrame({'Fare':[10,15,3,30]})
m1 = traindf['Fare'] <= 13.675550
m2 = (traindf['Fare'] <= 20.662183) & (traindf['Fare'] > 13.675550)
traindf['FareBand'] = np.select([m1, m2], [1,2], 3)
print (traindf)
Fare FareBand
0 10 1
1 15 2
2 3 1
3 30 3
您的解决方案可能会根据索引更改选择值,但不要使用它,因为速度很慢:
for index, row in traindf.iterrows():
if traindf.loc[index, 'Fare'] <= 13.675550:
traindf.loc[index, 'FareBand'] = 1
elif row['Fare'] <= 20.662183 and traindf.loc[index, 'Fare'] > 13.675550:
traindf.loc[index, 'FareBand'] = 2
else:
traindf.loc[index, 'FareBand'] = 3
print (traindf)
Fare FareBand
0 10 1.0
1 15 2.0
2 3 1.0
3 30 3.0
