选择熊猫数据框的切片时保留索引

时间:2019-01-07 15:15:18

标签: python pandas indexing

因此,我正在使用sklearn创建用于多元线性回归模型的训练和测试集。

我的数据集包含182个特征,如下所示:

int *

然后我有以下代码;

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 ,我就会失去索引(我将其设置为ID)。我想保留这些,因为当执行以下步骤时,我目前无法分辨结果中的哪些记录与原始dataframe.iloc中的哪些记录有关;

dataset

1 个答案:

答案 0 :(得分:1)

您的数据似乎以object类型存储。您应该将其转换为float64(假设所有数据均为数字类型。否则仅转换那些您希望具有数字类型的行)。由于事实证明您的索引是字符串类型,因此您需要在设置索引后 设置数据帧的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

现在,在切片DataFrame时,您应该只剩下values

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

使用.values,您可以访问DataFrame的基础numpy数组。这些没有索引列。由于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]更改为正确的列,以便索引将包含在切片中。