#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, :] . Я думал, что это не интуитивно понятно. Но если возникнут проблемы, о которых я упоминал, я думаю, это было бы лучше. Спасибо.