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

时间:2019-08-12 11:10:34

标签: python pandas sampling

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

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))

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

都没有达到我要求的方式。

对于输出,它应该是两个数据帧,不应共享任何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

使用该表将使我能够在原始数据帧上建立索引,并给我第二个表,其输出类似于以下内容:

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

1 个答案:

答案 0 :(得分:1)

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的类型数量!