#python #pandas #dataframe #types #casting
#python #pandas #фрейм данных #типы #Кастинг
Вопрос:
В фрейме данных с более чем 40 столбцами я пытаюсь изменить dtype для первых 27 столбцов с float на int с помощью iloc:
df1.iloc[:,0:27]=df1.iloc[:,0:27].astype('int')
Однако это не работает. Я не получаю никаких ошибок, но dtype также не меняется. Он по-прежнему остается плавающим.
Теперь самая странная часть:
Если я сначала изменю dtype только для 1-го столбца (как показано ниже):
df1.iloc[:,0]=df1.iloc[:,0].astype('int')
а затем запустите предыдущую строку кода:
df1.iloc[:,0:27]=df1.iloc[:,0:27].astype('int')
Это работает по мере необходимости.
Буду признателен за любую помощь в понимании этого и решении этой проблемы.
Спасибо!
Комментарии:
1. Какую версию pandas вы используете? Я не могу воспроизвести проблему. Я вижу, что тип столбца изменен на int32. без изменения только первого столбца
2. @Yash python: 3.8.3 pandas: 1.0.5
3. @Rishik, у меня есть pandas 1.0.3, не могли бы вы попробовать это? потому что у меня определенно нет проблем. Я также убедился, что прочитал файл как str, чтобы он не конвертировался автоматически. Но никаких проблем нет
4. @YashShah хорошо, тогда, я думаю, это должно что-то сделать с версией, я полагаю, тогда. Спасибо, проверю это.
Ответ №1:
Я думаю, это ошибка 1.0.5
. Я тестировал на своем 1.0.5
. У меня та же проблема, что и у вас. У .loc
него также та же проблема, поэтому я предполагаю, что разработчики pandas что-то нарушают iloc/loc
. Вам необходимо обновить до последней версии pandas или использовать обходной путь. Если вам нужен обходной путь, используйте назначение следующим образом
df1[df1.columns[0:27]] = df1.iloc[:, 0:27].astype('int')
Я протестировал это. Описанный выше способ устраняет эту ошибку. Он превратит первые 27 столбцов в dtype int32
Комментарии:
1. Вы уверены, что более новая версия Pandas изменила поведение обратно? Я использую 1.4.3, и он все тот же.
Ответ №2:
Просто не используйте iloc. Вы можете просто создать цикл над 27 столбцами и преобразовать их в нужный вам тип данных.
df.info()
my_columns = df.columns.to_list()[0:27]
for i in my_columns:
df[i] = df[i].astype('int32')
df.info()