基于分位数的数据框抽样(pandas)

3

我有一个数据框,想要根据参数 num_samples 进行抽样。 想要基于年龄在分位数上进行均匀抽样。

例如,如果我的数据框有1000行, num_samples = .5 ,那么我需要抽取500行,但是每个分位数需要抽取125行。

我的数据框的前几条记录如下:

Age  x1 x2 x3
12   1  1  2
45   2  1  3
67   4  1  2
11   3  4  10
18   9  7  6
45   3  5  8
78   8  4  7
64   6  2  3
33   3  2  2

我该如何在Python/Pandas中实现这个功能?


分位数意味着4个范围 [0-25), [25-50), [50-75), [75-100) - Amit Vikram Singh
是的!没错,我应该澄清一下。 - Eisen
1
如果您已经尝试过,请分享您尝试过的代码,可以吗? - David Erickson
我认为那些被称为“四分位数”,而不是“分位数”。 - Quang Hoang
2个回答

4
创建一个按列分位数的列,其中列名为Age1,然后使用布尔掩码和重采样从每个箱中进行抽样,使用pd.concat将获取每个箱子的样本连接起来。
labels = ['q1', 'q2', 'q3', 'q4']
df['quantile'] = pd.qcut(df.Age, q = 4, labels = labels)

out = pd.concat([df[df['quantile'].eq(label)].sample(1) for label in labels])

输出:

>>> out
   Age  x1  x2  x3 quantile
4   18   9   7   6       q1
8   33   3   2   2       q2
7   64   6   2   3       q3
2   67   4   1   2       q4

附注:如果要对n个样本进行采样,请将sample(1)更改为sample(n)


分位数应该是0百分位、25百分位、50百分位等。截止点应该是原始数字0、25、50等。 - Eisen

0
从 Pandas 1.1.0 开始,有 groupby().sample 可以做到这样的事情:
df.groupby(pd.qcut(df.Age, duplicates='drop')).sample(frac=0.5)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接