Python 使用groupby和loc设置新的数据帧

Python 使用groupby和loc设置新的数据帧,python,pandas,apply,pandas-groupby,loc,Python,Pandas,Apply,Pandas Groupby,Loc,嗨,我有一个数据框,如下所示: df = pd.DataFrame() df['Team1'] = ['A','B','C','D','E','F','A','B','C','D','E','F'] df['Score1'] = [1,2,3,1,2,4,1,2,3,1,2,4] df['Team2'] = ['U','V','W','X','Y','Z','U','V','W','X','Y','Z'] df['Score2'] = [2,1,2,2,3,3,2,1,2,2,3,3

嗨,我有一个数据框,如下所示:

df = pd.DataFrame()
df['Team1']   = ['A','B','C','D','E','F','A','B','C','D','E','F']
df['Score1']  = [1,2,3,1,2,4,1,2,3,1,2,4]
df['Team2']   = ['U','V','W','X','Y','Z','U','V','W','X','Y','Z']
df['Score2']  = [2,1,2,2,3,3,2,1,2,2,3,3]
df['Match']   = df['Team1']  + ' Vs '+ df['Team2']
df['Match_no']= [1,2,3,4,5,6,1,2,3,4,5,6]
df['model']  = ['ELO','ELO','ELO','ELO','ELO','ELO','xG','xG','xG','xG','xG','xG']
winner = df.Score1>df.Score2
df['winner']  = np.where(winner,df['Team1'],df['Team2'])
df1 =pd.DataFrame()
df1['Team1']   = ['U','C','Y','U','C','Y']
df1['Team2']   = ['B','X','F','B','X','F']

df1['Match']   = df1['Team1']  + ' Vs '+ df1['Team2']
df1['Match_no']= [1,2,3,1,2,3]
df1['model']  = ['ELO','ELO','ELO','xG','xG','xG']
我想做的是为下一阶段的比赛创建另一个日期框架。在下一阶段中,我们将为每个模型(ELO和xG)进行3次匹配。我想对模型进行分组。这些比赛按模式进行分组,第一场比赛和第一场比赛的获胜者,第三场比赛的获胜者和第四场比赛的获胜者等将参加比赛(即U对B,C对X,Y对F)。那么有人能告诉我如何抽调这些队伍吗

我预期的新数据帧如下所示:

df = pd.DataFrame()
df['Team1']   = ['A','B','C','D','E','F','A','B','C','D','E','F']
df['Score1']  = [1,2,3,1,2,4,1,2,3,1,2,4]
df['Team2']   = ['U','V','W','X','Y','Z','U','V','W','X','Y','Z']
df['Score2']  = [2,1,2,2,3,3,2,1,2,2,3,3]
df['Match']   = df['Team1']  + ' Vs '+ df['Team2']
df['Match_no']= [1,2,3,4,5,6,1,2,3,4,5,6]
df['model']  = ['ELO','ELO','ELO','ELO','ELO','ELO','xG','xG','xG','xG','xG','xG']
winner = df.Score1>df.Score2
df['winner']  = np.where(winner,df['Team1'],df['Team2'])
df1 =pd.DataFrame()
df1['Team1']   = ['U','C','Y','U','C','Y']
df1['Team2']   = ['B','X','F','B','X','F']

df1['Match']   = df1['Team1']  + ' Vs '+ df1['Team2']
df1['Match_no']= [1,2,3,1,2,3]
df1['model']  = ['ELO','ELO','ELO','xG','xG','xG']
我如何设置这个? 谢谢


Zep

我将尝试给你一个答案,尽管我很难理解你所说的“奇数比赛号码的赢家和偶数比赛号码的赢家”是什么意思

如果这意味着第1场和第2场比赛中的胜利者配对,那么第3场和第4场等等。你可以做一些简单的事情

df1['Team1'] = df.loc[::2, 'winner']
df1['Team2'] = df.loc[1::2, 'winner']
假设您的数据按显示的顺序排序。你可以通过

df[df['model'] == 'ELO'].sort_values('Match_no')
等。如果我没弄错的话,似乎不需要熊猫群比。

您可以使用以下方法计算每个组的数量:

df1 = pd.DataFrame()
df1['Team1'] = df.loc[::2, 'winner'].values
df1['Team2'] = df.loc[1::2, 'winner'].values
df1['Match'] = df1['Team1']  + ' Vs '+ df1['Team2']
model = df.loc[::2, 'model'].values
df1['Match_no'] = df1.groupby(model).cumcount() + 1
df1['model'] = model
print (df1)
  Team1 Team2   Match  Match_no model
0     U     B  U Vs B         1   ELO
1     C     X  C Vs X         2   ELO
2     Y     F  Y Vs F         3   ELO
3     U     B  U Vs B         1    xG
4     C     X  C Vs X         2    xG
5     Y     F  Y Vs F         3    xG

谢谢Kay,我需要的新数据帧(df)是来自上一个数据帧(df)的获奖者列表。然后,这些团队将被设置为比赛(即第一场比赛的胜利者与第二场比赛的胜利者,依此类推)。然后我想使用来自旧数据帧(df)的模型作为新列添加到新数据帧(df1)中,我不明白。为什么需要groupby?如果需要对奇偶行,则应工作。只有在某些组具有取消配对的行数时(可能吗?)。或者需要先按
df.groupby('model')筛选每个组的前6行。标题(6)
?亲爱的Jez,感谢您的回复。我需要在新的dataframe中重用来自模型的标签。正如我提到的,新的dataframe将有以下列Team1、Team2、Model.Yes-Jez。它起作用了。谢谢你的帮助。现在,如果我想为每个匹配分配匹配号,我可以使用基于型号的cumcount吗?我会给你一个机会try@Zephyr-当然,给我一点时间。嗨,杰兹,如果我想匹配1对3,2对4怎么样?@Zephyr-不确定是否理解,我的解决方案匹配1对3,2对4。你能解释更多吗?嗨,杰兹,在我的第一个数据帧(df)中,有6个匹配。每场比赛的获胜者将在下一阶段相遇(即第1场比赛的获胜者和第2场比赛的获胜者)。现在如果我想为下一阶段的比赛做准备(即第1场比赛的获胜者和第3场比赛的获胜者、第2场比赛的获胜者和第4场比赛的获胜者等)