Pandas根据列的和对数据集进行随机抽样

mklgxw1f  于 2023-04-04  发布在  其他
关注(0)|答案(2)|浏览(224)

我有一个dataframe,我想采样随机df.sample(n=13250),但基于一个条件,即列x (dtype=float) 的总和不超过12000。
知道怎么处理吗
我尝试df[df['x'].sum() <= 12000].sample(n=13250),但没有成功

ark|typedoc|planographic|intaglio|relief|photosensitive|monochrome|colors|x
btv1b7700367s|True|False|False|False|True|True|False|3.0

在我的示例中,ark是我的唯一id,除了列x之外,所有列的类型都是bool
为了更清楚地了解上下文,id对应于一个文档,每个文档可以有一个可能的页数,从1到455,在x列中表示。
我想创建一个样本的这个数据集,其中包含一个最大的12000页,而不是12000个文件,因为一个文件可以有很多页。最后一件事,我不想限制的文件数量为一个单一的页面,因为我需要有一个相当有代表性的人口与文件从min()到max()

snvhrwxg

snvhrwxg1#

您可以对原始 Dataframe 进行 Shuffle ,添加累积页数列,然后在累积页数超过12,000之前根据需要获取任意多的行:

sample = df[df["x"] <= 12_000].sample(frac=1)
sample = sample[sample["x"].cumsum() <= 12_000]

感谢@mozway的建议,答案被更新为仅对12,000页或更少的文档进行采样。这可以防止大文档(12,001页)在样本顶部被打乱,从而导致空选择。

1qczuiv0

1qczuiv02#

我作为新手的第一次尝试回答问题以变得更好:

def sample_docs(df):
sample_subset=pd.DataFrame([[]])
total_page = 0
while total_page < 12000:
    df_ = df.sample()
    sample_subset = sample_subset.append(df_)
    total_page = sample_subset['x'].sum()
return sample_subset

看起来有效,但很明显:

  • 未优化(当矢量化看起来更合适时循环,如@Code Different所示)
  • 使用append方法,已弃用。在这里使用concat会更好
  • 与@mozway之前所说的相同的缺点:抽样可能会给予数据一个不正确的感觉。2也许在抽样时使用分位数可以做到。

相关问题