【问题标题】:Using groupby and loc to set up a new dataframe使用 groupby 和 loc 建立一个新的数据框
【发布时间】:2018-12-08 06:02:18
【问题描述】:

我有一个如下的DataFrame:

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'])

我想做的是为下一阶段的锦标赛创建另一个日期框架。在下一阶段,我们将为每个模型(ELO 和 xG)进行 3 场比赛。我想按 Model 分组。这些比赛按模型分组,比赛编号 1 和比赛编号 1 的获胜者,比赛编号 3 对比赛编号 4 的获胜者等将进行比赛(即 U 对 B,C 对 X,Y 对 F )。那么谁能告诉我如何提取这些团队?

我预期的新数据框如下:

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']

我该如何设置?

【问题讨论】:

  • 我不明白。为什么需要groupby? previous solution 如果需要对奇数行和偶数行,应该可以工作。仅当某些组的行数不成对时它才应该失败(可能吗?)。还是需要先按df.groupby('model').head(6) 过滤每个组的前 6 行?
  • 亲爱的杰兹,感谢您的回复。我需要在新数据框中重用模型中的标签。正如我提到的,新的数据框将包含以下列 Team1、Team2、Model。

标签: python pandas pandas-groupby pandas-loc


【解决方案1】:

您可以使用GroupBy.cumcount 计算每个组的数量:

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

【讨论】:

  • 是的,杰兹。有用。谢谢您的帮助。现在如果我想为每场比赛分配比赛号码,我可以使用基于模型的 cumcount 吗?我会试一试
  • @Zephyr - 当然,等一下。
  • 嗨,Jez,如果我想匹配 1 vs 3、2 vs 4 怎么样?
  • @Zephyr - 不确定是否理解,我的解决方案匹配 1 对 3、2 对 4。你能解释更多吗?
  • 嗨,Jez,在我的第一个数据帧 (df) 中,有 6 个匹配项。每场比赛的获胜者将在下一阶段相遇(即第一场比赛的获胜者和第二场比赛的获胜者)。现在,如果我想为下一阶段设置比赛(即第 1 场比赛的获胜者和第 3 场比赛的获胜者,第 2 场比赛的获胜者和第 4 场比赛的获胜者等)
【解决方案2】:

我会尽力给你一个答案,虽然我很难理解你所说的“奇数比赛号码和偶数比赛号码获胜”是什么意思。

如果这意味着匹配 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')

等等。如果我没听错的话,似乎不需要 pandas-groupby。

【讨论】:

  • 谢谢凯,我需要的新数据框(df)是来自先前数据框(df)的获胜者列表。然后将这些团队设置为比赛(即获胜者比赛 1 与获胜者比赛 2,依此类推)。然后我想使用旧数据框(df)中的模型添加为新数据框(df1)中的新列
猜你喜欢
  • 1970-01-01
  • 2018-12-08
  • 2016-10-13
  • 1970-01-01
  • 2016-04-02
  • 2017-06-06
  • 2016-02-03
  • 1970-01-01
相关资源
最近更新 更多