Я не понимаю, почему моя колонка в моем наборе данных является NaN - PullRequest
0 голосов
/ 06 декабря 2018

Я пытаюсь создать тарифную полосу (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 () покажет, что все мои строки подтариф колонки: 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

В чем может быть причина?

Ответы [ 3 ]

0 голосов
/ 06 декабря 2018

Вы можете сделать это в три этапа без цикла:

traindf['FareBand'] = 3
traindf.loc[traindf['Fare'].between(13.675550, 20.662183), 'FareBand'] = 2
traindf.loc[traindf['Fare'].le(13.675550), 'FareBand'] = 1
0 голосов
/ 06 декабря 2018

Если вы хотите использовать метод, который вы описали, применяя изменения внутри цикла, все, что вам нужно сделать, это установить значение строки данных в конкретной позиции индекса:

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
    traindf.loc[index] = row
0 голосов
/ 06 декабря 2018

Я предлагаю использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...