如何从具有频率的数据帧中提取随机样本?

2024-09-28 21:20:44 发布

您现在位置:Python中文网/ 问答频道 /正文

给定16个具有如下颜色分布的球

In[1]: df = pd.DataFrame([10,5,1],index=['red', 'green','blue'], columns=['balls'])
In[2]: df
Out[2] 
            balls
    red       10
    green      5
    blue       1

我想提取一个随机子集,比如说,10个球,例如7个红色,2个绿色和1个蓝色。我不能使用df.sample(),因为这只会给我一个颜色,可能是由“balls”加权的,除非我把它放在一个循环中,每次提取1个球并更新剩余的球数。然而,这是非常缓慢的,当我们有100.000个500色的球,我们想随机抽取其中的80.000个。 我可以列个清单

In[3]: list = ['blue', 'blue', 'blue', ..., 'green', 'green', ..., 'blue']

取10个介于0和len(列表)之间的随机整数,但这似乎有点麻烦。 有没有简单快捷的方法来解决这个问题


Tags: columnsindataframedfindex颜色greenblue
1条回答
网友
1楼 · 发布于 2024-09-28 21:20:44

您可以获取数据帧的index

>>> colors = df.sample(10, replace=True, weights='balls').index
>>> colors
Index(['red', 'red', 'red', 'blue', 'red', 'red', 'red', 'red', 'blue',
       'green'],
      dtype='object')
>>> list(colors)
['red', 'red', 'red', 'blue', 'red', 'red', 'red', 'red', 'blue', 'green']

编辑:如注释中所述,这并不保证对球数的限制

为了保证这一点,您需要创建一个包含所有值的数据帧,然后对其调用sample(n)

>>> n_red, n_blue, n_green = (10, 1, 5)
>>> data = ['red'] * n_red + ['blue'] * n_blue + ['green'] * n_green
>>> df = pd.DataFrame(data, columns=['balls'])
>>> list(df.sample(10)['balls'])
['red', 'green', 'red', 'green', 'green', 'red', 'green', 'red', 'red', 'blue']

请注意,您不能再对样本进行加权,因为它们已按构造进行加权(颜色的行数越多,拾取该颜色的可能性就越大)

相关问题 更多 >