Изменить тип столбца с помощью iloc - PullRequest
0 голосов
/ 19 сентября 2018

Я хочу изменить dtype некоторых столбцов в моем DataFrame через iloc.Но когда я пытаюсь это сделать, dtype не меняется (он все еще объект):

import pandas as pd
names = ['sepal-length', 'sepal-width', 'petal-length', 'petal-width', 'class']
df = pd.read_csv('iris.csv', names=names, header=None)
df = df[1:]

In [11]: df.head()
Out[11]:
   sepal-length  sepal-width  petal-length  petal-width   class
1           5.1          3.5           1.4          0.2  setosa
2           4.9          3.0           1.4          0.2  setosa
3           4.7          3.2           1.3          0.2  setosa
4           4.6          3.1           1.5          0.2  setosa
5           5.0          3.6           1.4          0.2  setosa


In [12]: df.iloc[:,:-1] = df.iloc[:,:-1].astype(float)
# No Error

In [13]: df.dtypes  # still object dtype
Out[13]:
sepal-length    object
sepal-width     object
petal-length    object
petal-width     object
class           object
dtype: object

Примечание: я могу сделать это без iloc, но это слишком долго:

df[['sepal-length', 'sepal-width', 'petal-length', 'petal-width']] = df[['sepal-length', 'sepal-width', 'petal-length', 'petal-width']].astype(float)

Ответы [ 3 ]

0 голосов
/ 19 сентября 2018

Вы можете использовать infer_objects:

In [11]: df.infer_objects()
Out[11]:
   sepal-length  sepal-width  petal-length  petal-width   class
1           5.1          3.5           1.4          0.2  setosa
2           4.9          3.0           1.4          0.2  setosa
3           4.7          3.2           1.3          0.2  setosa
4           4.6          3.1           1.5          0.2  setosa
5           5.0          3.6           1.4          0.2  setosa

In [12]: df.infer_objects().dtypes
Out[12]:
sepal-length    float64
sepal-width     float64
petal-length    float64
petal-width     float64
class            object
dtype: object

Проблема в том, что правая сторона верна:

In [21]: df.iloc[:,:-1].astype(float).dtypes
Out[21]:
sepal-length    float64
sepal-width     float64
petal-length    float64
petal-width     float64
dtype: object

Назначение df.iloc[:,:-1] = обновляет существующие столбцы, а не изменяет их dtype.

0 голосов
/ 23 июня 2019

df.infer_objects() - это правильный способ подготовить df для алгоритмов машинного обучения (например, XGBoost).Большинство импортированных csv-фреймов данных имеют dty-типы 'объекта', и они не поддерживаются многими алгоритмами машинного обучения, такими как catboost, xgboost и т. Д. Чтобы они работали, используйте df.infer_objects().

0 голосов
/ 19 сентября 2018

Проблема с использованием iloc.Вы можете обойти это, используя обычную индексацию столбцов:

df[df.columns[:-1]] = df[df.columns[:-1]].astype(float)

В качестве альтернативы:

Вы можете применить to_numeric ко всем таким столбцам, и он пропустит class, потому что может 'может быть преобразовано:

df = df.apply(pd.to_numeric, errors='ignore', axis=1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...