在python中创建随机组分配

在python中创建随机组分配,python,pandas,Python,Pandas,我有一个Python脚本,它根据性能对滑雪者进行排名(列:“GJENNOMSNITT”),然后在GJENNOMSNITT上创建两个匹配的组:group1和group2。为此,我使用以下代码: def allokereGrupper(df1): df1 = df1.sort_values(by='GJENNOMSNITT', ascending=True) mask = np.arange(len(df1)) % 2 group1 = df1

我有一个Python脚本,它根据性能对滑雪者进行排名(列:“GJENNOMSNITT”),然后在GJENNOMSNITT上创建两个匹配的组:group1和group2。为此,我使用以下代码:

    def allokereGrupper(df1):
        df1 = df1.sort_values(by='GJENNOMSNITT', ascending=True)
        mask = np.arange(len(df1)) % 2
        group1 = df1.loc[mask == 0]
        print("gruppe 1:")
        print(group1)
        group2 = df1.loc[mask == 1]
        print("gruppe 2:")
        print(group2)
        return group1,group2
这个脚本的问题是,由于mask==0,最好的滑雪运动员总是在组1中。相反,我希望这是随机的。我已经用JavaScript编写了4个月了,但我无法用Python找到解决这个问题的好方法。有人能帮我吗

这是我所有的代码,你应该可以访问我正在阅读的csv文件

结果表

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

class Resultat:

    def lastInnOgRydd(path, LagreCsv = False):
        df = pd.read_csv(path, skiprows=2, decimal=".")
        filt = df['FINISH'] == 'DNF'
        dnf = df[filt]
        dnf = dnf.replace('DNF', 1)
        if LagreCsv == True:
            dnf.to_csv('DNF.csv')
        df.replace('DNF', np.NaN, inplace=True)
        df.replace('GARBAGE GARBAGE', np.NaN, inplace=True) #Denne finnes det nok en bedre løsning på
        df.dropna(subset=['FINISH'], inplace=True)
        df.dropna(subset=['NAME'], inplace=True)
        return df

    def endreDataType(df):
        df["FINISH"] = df["FINISH"].str.replace(',', '.').astype(float)
        df["INTER 1"] = df["INTER 1"].str.replace(',', '.').astype(float)
        df["SECTION IM4-FINISH"] = df["SECTION IM4-FINISH"].str.replace(',', '.').astype(float)
        df["COMMENT"] = df['COMMENT'].astype(int)
        df["COMMENT"] = df['COMMENT'].astype(str)
        df["COMMENT"] = df['COMMENT'].str.replace('11', 'COURSE 1')
        df["COMMENT"] = df['COMMENT'].str.replace('22', 'COURSE 2')
        df["COMMENT"] = df['COMMENT'].str.replace('33', 'COURSE 3')
        df["COMMENT"] = df['COMMENT'].str.replace('55', 'UTKJORING')
        df["COMMENT"] = df['COMMENT'].str.replace('99', 'STRAIGHT-GLIDING')
        pd.to_numeric(df['FINISH'], downcast='float', errors='raise')
        pd.to_numeric(df['INTER 1'], downcast='float', errors='raise')
        pd.to_numeric(df['SECTION IM4-FINISH'], downcast='float', errors='raise')
        return df

    def navnendringCommentTilCourse(df):
        df.rename(columns={'COMMENT': 'COURSE'}, inplace=True)
        return df

    def finnBesteRunder(df):
        grupper = df.groupby(['BIB#', 'COURSE'])
        bestruns = grupper['FINISH'].apply(lambda x: x.nsmallest(2).mean()).reset_index()
        print(bestruns)
        df1 = bestruns.pivot('BIB#', 'COURSE', 'FINISH').reset_index()
        df1['GJENNOMSNITT'] = df1['COURSE 1'].add(df1['COURSE 2']).add(df1['COURSE 3']).div(3)
        #df1['PRESTASJON'] = df1['MEAN'].div(df1['STRAIGHT-GLIDING']) # fjerner denne nå, men må med i den ordentilige analysen
        return df1

    def allokereGrupper(df1):
        df1 = df1.sort_values(by='GJENNOMSNITT', ascending=True)
        mask = np.arange(len(df1)) % 2
        group1 = df1.loc[mask == 0]
        print("gruppe 1:")
        print(group1)
        group2 = df1.loc[mask == 1]
        print("gruppe 2:")
        print(group2)
        return group1,group2

main.py

from moduler import Resultat

path = "http://www.cmagelssen.no/pilot2.csv"

df = Resultat.lastInnOgRydd(path)
df = Resultat.endreDataType(df)
df = Resultat.navnendringCommentTilCourse(df)
df = Resultat.finnBesteRunder(df)
df = Resultat.allokereGrupper(df)


因此,您希望这两个组在某种意义上匹配,即对于排名列表(
df1
)中的每一对连续滑雪者,将随机(以相同的概率)决定排名较高的滑雪者是否分配给第1组,排名较低的滑雪者是否分配给第2组,反之亦然

实现这一点的一种简单而有效的方法是,在将重复的0-1序列分配给
掩码
后,使用Python的标准
随机
模块对每对
掩码
值进行洗牌:

将numpy导入为np
随机输入
def AllokerEGR上部(df):
df=df.sort_值(按='gjennomsnit',升序=True)
mask=np.arange(len(df))%2
#新:对于每对掩码值,
#随机决定是否交换它们
对于范围内的i(0,len(df),2):
随机洗牌(蒙版[i:i+2])
group1=df.loc[掩码==0]
打印(“gruppe 1:”)
打印(第1组)
group2=df.loc[掩码==1]
打印(“gruppe 2:”)
打印(第2组)
返回组1,组2

请注意,我将参数的名称更改为
df
,以便更明确地说明这是一个通用函数。为了使其更加通用,您也可以将要排序的列的名称作为参数传递。

def allokereGrupper(df1):df1=df1.sort_值(by='gjennomsnit',ascending=True)mask=np.arange(len(df1))%2打印(mask)范围内的i(0,len(df1),2):random.shuffle(mask[i:i+2])group1=df1.loc[mask==0]group1['GRUPPE']='BLOCKED'group2=df1.loc[mask==1]group2['GRUPPE']='RANDOM'打印(group1)这样打印(group2)吗?我编辑了我的问题;我想实现的目标模糊不清。这是你提出的我感兴趣的第二个解决方案。我有一个运动员的排名列表,我希望随机的和被阻止的群体有一个应用程序。同等绩效水平。这是一个学习实验,谢谢你对我答案的反馈。我相应地更新了它。