【问题标题】:Groupby sample pandas with keeping the groups lower than n if applicableGroupby 采样 pandas,如果适用,组保持低于 n
【发布时间】:2021-06-07 11:58:35
【问题描述】:

我有一个数据集,我想在 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

但似乎效率极低

【问题讨论】:

    标签: python pandas dataframe pandas-groupby


    【解决方案1】:

    我认为最干净的答案可能是对您的数据进行洗牌,然后从每个组中选择最多 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)
    

    【讨论】:

    • 确实,干净的解决方案有效,感谢您的回答,我在这里考虑了 sample 和 groupby 的顺序(它可能会更好/更快地颠倒)但它可能无关紧要
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2016-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-07
      • 1970-01-01
      相关资源
      最近更新 更多