Мне нужно изменить тип нескольких столбцов в фрейме данных pandas. Не удается сделать это с помощью iloc

#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()