首页 > 解决方案 > 使用 Pandas 的 id 的最大连续行?

问题描述

我对熊猫很陌生。我有两个与两个玩家游戏相关的数据框

DF1:matches # match information 

match_num   winner_id   loser_id    
270      201504         201595
271      201514         201426
272      201697         211901
273      201620         211539
274      214981         203564
DF2: players #information about the players

playerid  First Name    Last Name   Country
200001     Martina      Hingis        SUI
200002     Mirjana      Lucic         CRO
200003     Justine      Henin         BEL

完整数据:https ://drive.google.com/file/d/1QHglO3DkZPDFvqHH-jJYDbYh3jylo2-C/view?usp=sharing

我需要找出哪些球员连续赢得最多比赛?

这可以使用sql函数解决吗?

提前致谢!!

标签: pythonsqlpandasdataframedata-analysis

解决方案


您提供的示例并不是真正有用,因为每个 id 不超过一个匹配项。这是一个更好的:

   match_num  winner_id  loser_id
0        270          3         2
1        271          2         3
2        272          3         4
3        273          4         1
4        274          2         4

我提出的 pandas 解决方案有点冗长。我们首先使用 , 将数据框重塑为长格式melt,并按匹配排序。然后我们计算一个对应于相同类型(赢/输)的连续匹配的组。最后,我们只保留胜利,计算组大小(即连续获胜的次数)并排序。

(df.melt(id_vars='match_num',
         var_name='wl',
         value_name='ID')
   .sort_values(by=['ID', 'match_num'])
   .assign(group=lambda d: d.groupby('ID')['wl'].apply(lambda s: s.ne(s.shift()).cumsum()))
   .query('wl == "winner_id"')
   .groupby(['ID', 'group']).size()
   .sort_values(ascending=False)
   .droplevel('group')
   .rename('consecutive_win')
   .to_frame()
 )

输出:

    consecutive_win
ID                 
2                 2
3                 1
3                 1
4                 1

推荐阅读