我有一个数据框,希望使用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
和{ {1}}工作正常,我正在努力查看如何工作。
说明我正在寻找的伪代码如下:
.iloc
答案 0 :(得分:2)
如果您不想在copy
通话中DataFrame
model_selection.train_test_split()
,则可以使用loc
:
df.loc[train_df.index, 'Dataset'] = 'train'
df.loc[test_df.index, 'Dataset'] = 'test'
答案 1 :(得分:2)
一种方法是使用np.where
添加一个以布尔条件为条件的序列:
df['Dataset'] = np.where(df.index.isin(train_df.index.values), 'train', 'test')
当然,这假定train_df
中没有包含的索引必须中存在。
或使用test_df
获得更具适应性的解决方案:
np.select