Объединение numpy массивов без изменения типов столбцов - PullRequest
0 голосов
/ 14 июля 2020

Я пытаюсь объединить два массива numpy (один с плавающей запятой, другой int) по горизонтали и поместить его через pandas DataFrame.

Итак, я попробовал:

from sklearn.datasets import load_iris
    
iris = pd.DataFrame(np.concatenate((load_iris().data, np.array([load_iris().target]).T), axis=1), 
                    columns=[load_iris().feature_names+['target']])

Но это автоматически преобразует столбец target в столбец типа float из исходного int. Я попытался преобразовать его обратно в int с помощью

iris.target = iris.target.astype(int)

, но это вызывает ошибку TypeError:

TypeError: only integer scalar arrays can be converted to a scalar index

Так что у меня есть несколько вопросов.

(i ) Что говорит эта ошибка?

(ii) Можно ли вообще изменить тип отдельного столбца? (Между прочим, iris = iris.astype(int) отлично работает, но при этом каждый столбец преобразуется в столбец типа int, чего я не хочу.)

(iii) Каков наиболее эффективный с точки зрения памяти способ делаю что хочу? Приведенный ниже код производит то, что я пытаюсь сделать:

iris = pd.concat([pd.DataFrame(load_iris().data, columns = load_iris().feature_names), 
                  pd.DataFrame(load_iris().target, columns=['target'])], axis=1)

Но при этом возникают проблемы с созданием нескольких pandas DataFrames и их объединением. Есть ли лучший способ получить точно такой же результат?

1 Ответ

2 голосов
/ 14 июля 2020

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

iris.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 150 entries, 0 to 149
Data columns (total 5 columns):
 #   Column                Non-Null Count  Dtype  
---  ------                --------------  -----  
 0   (sepal length (cm),)  150 non-null    float64
 1   (sepal width (cm),)   150 non-null    float64
 2   (petal length (cm),)  150 non-null    float64
 3   (petal width (cm),)   150 non-null    float64
 4   (target,)             150 non-null    float64
dtypes: float64(5)
memory usage: 6.0 KB

iris[[('target',)]] = iris[[('target',)]].astype(int)
# iris.iloc[:,4] = iris.iloc[:,4].astype(int)

iris.head()

|    |   ('sepal length (cm)',) |   ('sepal width (cm)',) |   ('petal length (cm)',) |   ('petal width (cm)',) |   ('target',) |
|---:|-------------------------:|------------------------:|-------------------------:|------------------------:|--------------:|
|  0 |                      5.1 |                     3.5 |                      1.4 |                     0.2 |             0 |
|  1 |                      4.9 |                     3   |                      1.4 |                     0.2 |             0 |
|  2 |                      4.7 |                     3.2 |                      1.3 |                     0.2 |             0 |
|  3 |                      4.6 |                     3.1 |                      1.5 |                     0.2 |             0 |
|  4 |                      5   |                     3.6 |                      1.4 |                     0.2 |             0 |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...