【问题标题】:How to extract a random sample from a pandas dataframe with frequencies?如何从具有频率的熊猫数据框中提取随机样本?
【发布时间】:2021-03-12 11:33:09
【问题描述】:

给定 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 个随机整数,但这似乎有点麻烦。 有没有简单快捷的方法来解决这个问题?

【问题讨论】:

    标签: python pandas random


    【解决方案1】:

    可以取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']
    

    编辑:如 cmets 所述,这并不能保证对球数的限制。

    为保证这一点,您需要创建一个包含所有值的 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']
    

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

    【讨论】:

    • 请注意,这并不能保证返回的球数将小于或等于可用球数,因为这是基于概率的。如示例中所示(从 1 个中返回 2 个蓝色)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-30
    • 2023-03-13
    • 2021-03-05
    • 2019-03-24
    • 1970-01-01
    • 2018-11-16
    • 1970-01-01
    相关资源
    最近更新 更多