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

Igo*_*arm 4 python dataframe pandas pandas-groupby

我有一个数据集,我想在 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
Run Code Online (Sandbox Code Playgroud)

但看起来效率极低

Mat*_*att 8

我认为最干净的答案可能是打乱数据,然后选择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)
Run Code Online (Sandbox Code Playgroud)