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

时间:2021-03-12 11:33:09

标签: python pandas random

给定颜色分布如下的 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(),因为那只会给我一个颜色,可能由“球”加权,除非我把它放在一个循环中并在当时提取 1 个球并更新剩余的球数。然而,这非常慢,当我们有 100.000 个具有 500 种颜色的球并且我们想要随机提取其中的 80.000 个时。 我可以列个清单,

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

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

1 个答案:

答案 0 :(得分:3)

您可以获取 DataFrame 的 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']

编辑:如评论中所述,这并不能保证球数的限制。

为了保证这一点,您需要创建一个包含所有值的 DataFrame,然后对其调用 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']

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