代码:
import pandas as pd
df = pd.DataFrame({'data': list(range(100))})我想取一个20码的样本,这样80%的元素在0到10之间,20%在50到70之间。(随机抽样)。
我想要一种适用于任意数量条件的方法。
我的想法是可行的,但不是干净的:对所有介于0到10之间的东西进行采样,取80% * 20行随机行,对其余的值执行同样的操作,并进行连接。是否有一种熊猫-我可以使用,因为这不能很好地适应更多的条件?
发布于 2022-05-27 13:15:03
你可以用垃圾桶和一本比例大小的字典来取样。
# ┌─0─┐┌─1─┐┌─2─┐┌─3───┐
bins = [-1, 10, 50, 70, float('inf')]
fraction = {0: 0.8, 2: 0.2} # group 0 is -1-10, group 2 is 50-70
size = 20
groups = pd.cut(df['data'], bins=bins, labels=range(len(bins)-1))
sampled = (df
.groupby(groups)['data']
.apply(lambda g: g.sample(n=int(fraction.get(g.name, 0)*size),
replace=True)
)
#.droplevel(0)
)注意:我在这里的示例中使用了replace=True,否则不可能从组0-10中获得16个唯一元素,但是您可以在真实的条件数据中更改这一点,这是安全的。另外,添加.droplevel(0)以移除组id。
产出:
data
0 6 6
8 8
2 2
3 3
0 0
0 0
6 6
0 0
6 6
3 3
10 10
3 3
8 8
8 8
8 8
2 2
2 54 54
53 53
62 62
64 64
Name: data, dtype: int64https://stackoverflow.com/questions/72405418
复制相似问题