我的目标是将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)
然后,我合并aux
和ya
以获取一个拆分,并合并aux1
和yb
以获取另一个拆分。
a = pd.merge(aux, ya, left_index=True, right_index=True)
b = pd.merge(aux1, yb, left_index=True, right_index=True)
它起作用了,但是两个分层列是caseID
和personID
。可以有几行具有相同的caseID,也可以有几行具有相同的personID。
我不能在两个分割中都出现caseID,我也不允许在两个分割中都出现personID。因此,我需要设置一个约束,使一个人必须始终处于同一分裂状态。与案例相同,caseID不能同时位于两个拆分中。
例如,如果我有三行具有以下值:
+-----------------------------------+------------+
| CaseID | PersonID |
+-----------------------------------+------------+
| 1 | 2 |
| 1 | 3 |
| 2 | 5 |
+-----------------------------------+------------+
由于前两个具有相同的CaseID,因此前两个必须位于同一拆分中。
有没有可以允许我执行此操作的库/功能?
答案 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,以获取概述说明。