У меня есть фрейм данных, который я хочу разделить на наборы "train" и "test", используя функцию sklearn.model_selection.train_test_split
. Эта функция возвращает два среза исходного DataFrame. Однако мне нужно, чтобы это было в одном DataFrame с записью столбца, которая идентифицирует тип записи. Я мог бы написать функцию, которая делает это вместо этого, но использование функции sklearn удобно и надежно.
Мой текущий подход заключается в следующем:
import pandas as pd
import numpy as np
from sklearn import model_selection
dates = pd.date_range('20130101',periods=10)
df = pd.DataFrame(np.random.randn(10,4),index=dates,columns=list('ABCD')).reset_index()
split = [0.8, 0.2]
split_seed = 123
train_df, test_df = model_selection.train_test_split(df, train_size = split[0], test_size = split[1], random_state=split_seed)
train_df["Dataset"] = "train"
test_df["Dataset"] = "test"
final_df = train_df.append(test_df)
Это прекрасно работает, но выдает предупреждение, так как я изменяю скопированные фрагменты вместо исходного df
объекта:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
Это не имеет большого значения, так как после этого оригинальный DataFrame больше не используется. Но мне любопытно, как я мог сделать это по-другому. Я предполагаю, что вместо редактирования train_df
и test_df
и добавления их снова, я мог бы просто отредактировать df
напрямую, но, поскольку я не очень хорошо знаком с тем, как работают .loc
и .iloc
, я изо всех сил пытаюсь посмотрим, как это будет работать.
Код Psuedo, который иллюстрирует то, что я ищу, будет выглядеть следующим образом:
df["Dataset"] = "train" WHERE index in train_df.index.values
df["Dataset"] = "test" WHERE index in test_df.index.values