首页 > 解决方案 > 有没有办法对“类型”列进行采样,同时将该类型中的所有 ID 保留在另一列中?

问题描述

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

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

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

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

标签: pythonpandassampling

解决方案


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


推荐阅读