Skip to main content
 首页 » 编程设计

python之我不明白为什么我的数据集中的列是 NaN

2025年05月04日15insus

我试图通过这个循环创建一个票价区间 (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