繁体   English   中英

Groupby 样本 pandas 保持组低于 n(如果适用)

[英]Groupby sample pandas with keeping the groups lower than n if applicable

我有一个数据集,我想在 groupby 之后对其进行采样。 一般来说,它可以通过df.groupby("some_id").sample(n=100)来实现。 但问题是某些组的样本少于 100 个(是的,replace=True 是一种选择,但是如果我们想减少样本怎么办,我的意思是,如果该组的样本超过 100 个,我希望样本量为 100,如果更少 - 保持原样)。 我找不到一个实现类似目标的例子,任何想法都值得赞赏。 现在我唯一的想法是忘记groupby,创建让我们说组列表或类似的东西

groups_list=[]

for i in df.some_id.unique():


    groups_list.append(df[df_some_id==i].apply(weird_sampling))

def weird_sampling(df):

    if (df.shape[0]>99):
        return df.sample(100)
    return df

但这似乎效率极低

我认为最干净的答案可能是洗牌你的数据,然后 select 每组n

# maximum number of elements in group
n = 100

# sample(frac=1) --> randomise the order
# groupby("some_id").head(n) --> select up to n
df.sample(frac=1).groupby("some_id").head(n)

在对这个问题进行了更多尝试之后,我提出了这个想法,这可能仍然不是最好或最有效的解决方案,但已经好得多并且可以完成工作

 df = df.groupby("some_id").apply(lambda x:  x.sample(n = 100) if (x.shape[0]>99) else x)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM