Изменение значений столбцов с помощью iloc не работает

#python #pandas

#python #панды

Вопрос:

Я хочу создать столбец ‘istrain’ в dataframe. Некоторые строки принадлежали обучающим данным, некоторые — тестовым данным.

Итак, я попробовал, как показано ниже.

 df['istrain'] = 0
df.iloc[:train_len,:]['istrain'] = 1
  

Но это не сработало.

Я решил свою проблему, изменив код, как показано ниже, но я все еще хочу знать, почему приведенный выше метод неверен. Также полезно предложить лучший способ. Спасибо за ваш ответ.

 df['istrain'] = 0
df.iloc[:train_len,data.columns.get_loc('istrain')] = 1
  

Комментарии:

1. Пожалуйста, обратитесь к документации Pandas.

Ответ №1:

iloc индексирование на основе целых чисел.

df.iloc[:train_len,:]['istrain'] возвращает представление, и из-за соображений производительности результат по своей сути непредсказуем. Это задокументировано здесь . (то же самое относится и к df[:train_len]['istrain']

Правильный способ его использования использовать df.columns.get_loc('istrain') , чтобы получить местоположение столбца как целое число и поэтому использовать его непосредственно внутри iloc и обновлять значение.

Однако гораздо лучший способ справиться с такими ситуациями — использовать индекс на основе расположения меток loc

df.loc[:train_len,'istrain'] = 1

Комментарии:

1. Чтобы использовать iloc, мне пришлось изменить код так же, как df.iloc[:train_len -1, :] . Я думал, что это не интуитивно понятно. Но если возникнут проблемы, о которых я упоминал, я думаю, это было бы лучше. Спасибо.