具有特定条件的Python中数据集的A / B拆分

时间:2019-02-01 12:07:21

标签: python machine-learning

我的目标是将9列的数据集分为两个不同的分层数据集。七列必须分层,另外两列必须以特定方式拆分。

我检查了A / B拆分库,但没有找到,因此我只使用sklearn.model_selection.train_test_split,设置test_size=0.5来使两个数据集具有相同的长度。作为y,我传递了必须分层的列。

X包含不需要按分层方式拆分数据。 y包含需要分层的数据。

aux, aux1, ya, yb = train_test_split(X,y,test_size=0.5)

然后,我合并auxya以获取一个拆分,并合并aux1yb以获取另一个拆分。

a = pd.merge(aux, ya, left_index=True, right_index=True) b = pd.merge(aux1, yb, left_index=True, right_index=True)

它起作用了,但是两个分层列是caseIDpersonID。可以有几行具有相同的caseID,也可以有几行具有相同的personID。

我不能在两个分割中都出现caseID,我也不允许在两个分割中都出现personID。因此,我需要设置一个约束,使一个人必须始终处于同一分裂状态。与案例相同,caseID不能同时位于两个拆分中。

例如,如果我有三行具有以下值:

+-----------------------------------+------------+
|               CaseID              |  PersonID  |
+-----------------------------------+------------+
| 1                                 |     2      |
| 1                                 |     3      |
| 2                                 |     5      |
+-----------------------------------+------------+

由于前两个具有相同的CaseID,因此前两个必须位于同一拆分中。

有没有可以允许我执行此操作的库/功能?

1 个答案:

答案 0 :(得分:0)

对于这种方法,您需要使用通常称为split-apply-combine的技术。为此,我们将使用Groupbys。

您的首要任务是将数据分成相关的组。

df_by_CaseID = df.groupby('CaseID')

此后,您将应用拆分,您将不得不在此处进行一些工作,因为您将改组groupby对象而不是dataframe。 Read here for more on groupby.

然后您可以使用pd.dataframe组合每个分组依据项目。

获取此信息后,请记住要对数据进行随机排序,因为它们将按caseID分组,这可能会对您的模型产生影响。如果您有疑问,请在下面评论。也checkout this,以获取概述说明。