有没有一种方法可以在 'type' 列上进行采样,同时将所有 ID 保留在另一列中的该类型中?

Is there a way to sample on a 'type' column, whilst keeping all ID's within that type in another column?

我将一个数据帧一分为二;一个获取一段时间内的平均值,另一个使用该平均值。数据框类似于以下内容:

ID    Type    Num. Hours     Month

2     black       10           Jan

2     black       12           Feb

2     black       15           March

3     red         7            Jan

3     red         10           Feb

每个 ID 都有 24 行,跨越 2 年。不同的 ID 可以具有相同的类型或不同的类型。 我希望两个拆分数据帧具有相同数量的不同类型,同时将每个唯一 ID 的所有 24 个 ID 放在一起。

我试过按类型和 ID 分组,一起分组和单独分组,但它似乎只给我一小部分 ID,而不是将它们放在一起

df1 = df.groupby('ID')['Type'].apply(lambda x: x.sample(frac=0.5))

df1 = df.groupby(['ID', 'Type']).apply(lambda x: x.sample(frac=0.5))

当然,之后我会使用比索引从原始数据帧中获取第二个拆分数据帧。

两者都没有按我要求的方式工作。

对于输出,它应该是两个数据帧,它们不应共享任何 ID,并且具有相同数量的不同类型。

所以使用与上面类似的东西,我希望输出一个如下所示的 DataFrame:

ID    Type    Num. Hours     Month

2     black       10           Jan

2     black       12           Feb

2     black       15           March

5     yellow       17           Jan

5     yellow       21           Feb

使用 table 将允许我在原始数据帧上建立索引并给我第二个 table 输出类似于以下内容的内容:

ID    Type    Num. Hours     Month

4     black       10           Jan

4     black       12           Feb

4     black       15           March

6     yellow      22            Jan

6     yellow      27            Feb

sample 取一小部分但不将数据帧一分为二。拿到了一半样本,拿另一半就简单了!

我假设您的原始线路按照您希望它在第一个数据帧上工作的方式工作

df1 = df.groupby(['ID', 'Type']).apply(lambda x: x.sample(frac=0.5))
df2 = df[~df.index.isin(df1.index)]

更新

基于评论;要将 ID 随机划分为两个数据帧,您可以使用以下命令:

import random

unique_ids = df.ID.unique()
random.shuffle(unique_ids)
id_set_1 = unique_ids[: len(unique_ids) // 2]  # take first half of list

df1 = df[df.ID.isin(id_set_1)]
df2 = df[~df.ID.isin(id_set_2)]

请注意,这可能会导致两个数据帧的大小差异很大,具体取决于每个 ID 的类型数量!