簡體   English   中英

如何從具有頻率的 pandas dataframe 中提取隨機樣本?

[英]How to extract a random sample from a pandas dataframe with frequencies?

給定 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 個 colors 時,我們想隨機提取其中的 80.000 個。 我可以列個清單,

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

並取 0 到 len(list) 之間的 10 個隨機整數,但這似乎有點麻煩。 有沒有一種簡單快捷的方法來解決這個問題?

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

請注意,您不能再對樣本進行加權,因為它們已經通過構造加權(顏色具有的行越多,選擇該顏色的可能性就越大)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM