Сохранение индекса при выборе фрагмента кадра данных панд - PullRequest
0 голосов
/ 07 января 2019

Итак, я создаю свои обучающие и тестовые наборы для использования в модели множественной линейной регрессии с использованием sklearn.

мой набор данных содержит 182 функции, выглядит следующим образом:

id      feature1 feature2  ....  feature182 Target
D24352  145      8               7          1
G09340  10       24              0          0
E40988  6        42              8          1
H42093  238      234             2          1   
F32093  12       72              1          0

У меня есть следующий код:

import pandas as pd

dataset = pd.read_csv('C:\\mylocation\\myfile.csv')
dataset0 = dataset.set_index('t1.id')
dataset2 = pd.get_dummies(dataset0)
y = dataset0.iloc[:, 31:32].values
dataset2.pop('Target')
X = dataset2.iloc[:, :180].values

Однако когда я использую dataframe.iloc, я теряю свои индексы (которые я установил в качестве своих идентификаторов). Я хотел бы сохранить их, поскольку в настоящее время у меня нет возможности сказать, какие записи в моих результатах относятся к каким записям в моем оригинальном dataset, когда я делаю следующий шаг;

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

from sklearn.linear_model import LinearRegression
regressor = LinearRegression()
regressor.fit(X_train, y_train)

y_pred = regressor.predict(X_test)

1 Ответ

0 голосов
/ 07 января 2019

Похоже, ваши данные хранятся в виде object. Вы должны преобразовать его в float64 (при условии, что все ваши данные имеют числовой тип. В противном случае преобразуйте только те строки, которые вы хотите иметь как числовой тип). Поскольку оказывается, что ваш индекс имеет тип string, вам нужно установить dtype вашего фрейма данных после , установив индекс (и сгенерировав пустышки). Снова предполагая, что остальные ваши данные имеют числовой тип:

dataset = pd.read_csv('C:\\mylocation\\myfile.csv')
dataset0 = dataset.set_index('t1.id')
dataset2 = pd.get_dummies(dataset0)
dataset0 = dataset0.astype(np.float64)  # add this line to explicitly set the dtype

Теперь вы должны иметь возможность просто пропустить values при разрезании DataFrame:

y = dataset0.iloc[:, 31:32]
dataset2.pop('Target')
X = dataset2.iloc[:, :180]

С помощью .values вы получаете доступ к базовым массивам данных в DataFrame. У них нет столбца индекса. Поскольку sklearn в большинстве случаев совместим с pandas, вы можете просто передать pandas DataFrame в sklearn.

Если это не работает, вы все равно можете применить reset_index к вашему DataFrame. Это добавит индекс в качестве нового столбца, который вам придется отбрасывать при передаче данных обучения в sklearn:

dataset0.reset_index(inplace=True)
dataset2.reset_index(inplace=True)
y = dataset0.iloc[:, 31:32].values
dataset2.pop('Target')
X = dataset2.iloc[:, :180].values

from sklearn.cross_validation import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size = 0.2, random_state = 0)

from sklearn.linear_model import LinearRegression
regressor = LinearRegression()
regressor.fit(X_train.drop('index', axis=1), y_train.drop('index', axis=1))

y_pred = regressor.predict(X_test.drop('index', axis=1))

В этом случае вам все равно придется изменить срезы [:, 31:32] и [:, :180] на правильные столбцы, чтобы индекс был включен в срез.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...