如何用pandas从一个数据框中创建测试和训练样本?

556 投票
30 回答
812925 浏览
提问于 2025-04-18 09:19

我有一个比较大的数据集,格式是一个数据框(dataframe),我想知道怎么把这个数据框随机分成两个部分,一个占80%用来训练,另一个占20%用来测试。

谢谢!

30 个回答

34

不需要转换成numpy。直接用pandas的数据框(df)来进行分割,这样会返回一个pandas的数据框。

from sklearn.model_selection import train_test_split

train, test = train_test_split(df, test_size=0.2)

如果你想把x和y分开

X_train, X_test, y_train, y_test = train_test_split(df[list_of_x_cols], df[y_col],test_size=0.2)

如果你想分割整个数据框

X, y = df[list_of_x_cols], df[y_col]
42

我会使用scikit-learn自带的训练测试分割功能,然后从索引中生成数据。

from sklearn.model_selection import train_test_split


y = df.pop('output')
X = df

X_train,X_test,y_train,y_test = train_test_split(X.index,y,test_size=0.2)
X.iloc[X_train] # return dataframe train
433

Pandas的随机抽样也可以用

train=df.sample(frac=0.8,random_state=200)
test=df.drop(train.index)

如果你使用相同的random_state值,那么每次得到的训练集和测试集的数据都是完全一样的。这就让你在随机分开训练数据和测试数据的同时,也能保证结果的一致性。

967

Scikit Learn中的train_test_split功能非常好用。它可以将numpy数组和数据框(dataframe)进行分割。

from sklearn.model_selection import train_test_split

train, test = train_test_split(df, test_size=0.2)
483

我会直接用numpy的 randn 函数:

In [11]: df = pd.DataFrame(np.random.randn(100, 2))

In [12]: msk = np.random.rand(len(df)) < 0.8

In [13]: train = df[msk]

In [14]: test = df[~msk]

为了确认这个方法有效,我们可以看看结果:

In [15]: len(test)
Out[15]: 21

In [16]: len(train)
Out[16]: 79

撰写回答