【问题标题】:Randomly selecting n rows from pandas dataframe and moving them to new df without repetition从 pandas 数据框中随机选择 n 行并将它们移动到新的 df 而不重复
【发布时间】:2022-01-12 18:10:22
【问题描述】:

我有一个包含 140 个学生的数据框,我需要将每个学生随机分配给 5 个 TA(评分者)中的一个。

一个例子是

graders = ['K', 'M', ]

df = pd.DataFrame({
    'First name': ['John', 'Paul', 'George','Ringo'], 
    'Last name':['Lennon', 'McCartney', 'Harrison', 'Star'], 
    })

df['Grader'] = ''

我如何将评分者“K”随机分配给 3 名学生,然后将其余分配给“M”,以确保学生不能同时进入两组。

我在这里查看了许多答案,但没有人为我澄清,任何帮助将不胜感激。

【问题讨论】:

  • 为什么不在数据框中添加列分级器?

标签: python pandas random


【解决方案1】:

您可以分配一个随机数 1-5,然后将这些数字映射到 TA。不过,这并不能保证每个 TA 获得总数的 1/5。

import pandas as pd
import numpy as np

df['id'] = np.random.randint(1,6, df.shape[0]) # make a new column of random ints 1-5
df['Grader'] = df['id'].map({1:'a',2:'b',3:'c',4:'d',5:'e'}) # turns 1 to 'a', 2 to 'b', etc. Change this to your actual TAs.

【讨论】:

    【解决方案2】:

    使用df.sample:

    In [1291]: df['Grader'] = 'M' # Assign `M` to all the students at first
    
    In [1299]: df.loc[df.sample(n=3).index, 'Grader'] = 'K' # Randomly choose 3 students and change their Grader to 'K'
    
    In [1300]: df
    Out[1300]: 
      First name  Last name Grader
    0       John     Lennon      K
    1       Paul  McCartney      M
    2     George   Harrison      K
    3      Ringo       Star      K
    

    【讨论】:

    • 有没有办法确保一旦分配了一行,它就不会包含在下一轮分配中?
    猜你喜欢
    • 1970-01-01
    • 2013-04-02
    • 1970-01-01
    • 2013-04-23
    • 1970-01-01
    • 2015-05-21
    • 1970-01-01
    • 2016-02-01
    相关资源
    最近更新 更多