Pandas中统计从X队到Y队的球员月度转会次数优化问询
优化每月X→Y转会球员统计代码的方案
嘿,我来帮你优化这段代码,顺便还能Fix原代码里的一个潜在逻辑漏洞!先明确你的需求:统计每个月从Team X转会到Team Y的球员总数,而且同一球员当月可能有多条重复记录对吧?
原代码的问题
原代码虽然能得到预期结果,但存在两个明显问题:
- 步骤冗余:多次分组、去重和索引重置,效率偏低,尤其是数据量较大时会更明显;
- 逻辑漏洞:没有判断球员是从X转Y,还是从Y转X——如果有球员先加入Y再转到X,原代码会错误地把他的转会月份(X的月份)统计进去。
高效优化方案(两种可选)
方案一:利用分组获取首次入队时间,精准筛选转会
这个方法通过定位每个球员加入X和Y的最早月份,确保只统计先X后Y的转会:
import pandas as pd # 给定的原始数据 df = pd.DataFrame({'Player': [1,1,1,1,2,2,2,3,3,3,4,5], "Team": ['X','X','X','Y','X','X','Y','X','X','Y','X','Y'], 'Month': [1,1,1,2,1,1,2,2,2,3,4,5]}) # 1. 获取每个球员加入各队伍的最早月份 player_team_first = df.groupby(['Player', 'Team'])['Month'].min().unstack() # 2. 筛选:同时加入过X和Y,且X的加入时间早于Y的球员(确保是X→Y转会) valid_transfers = player_team_first.dropna(subset=['X', 'Y']) valid_transfers = valid_transfers[valid_transfers['X'] < valid_transfers['Y']] # 3. 统计每个月份的转会人数(转会月份为加入Y的最早月份) result = valid_transfers['Y'].value_counts().sort_index().reset_index(name='Count') result.columns = ['Month', 'Count'] print(result)
输出结果:
Month Count 0 2 2 1 3 1
方案二:利用移位操作直接定位转会节点
这个方法更直观,通过时间排序+移位对比,直接找到从X切换到Y的那个月份:
import pandas as pd df = pd.DataFrame({'Player': [1,1,1,1,2,2,2,3,3,3,4,5], "Team": ['X','X','X','Y','X','X','Y','X','X','Y','X','Y'], 'Month': [1,1,1,2,1,1,2,2,2,3,4,5]}) # 1. 按球员和月份排序,确保时间顺序 df_sorted = df.sort_values(['Player', 'Month']) # 2. 去重同一球员当月的重复记录(保留当月最后一条即可) df_unique = df_sorted.drop_duplicates(['Player', 'Month'], keep='last') # 3. 获取每个球员上一个月份的队伍 df_unique['prev_team'] = df_unique.groupby('Player')['Team'].shift(1) # 4. 筛选:当前队伍是Y,且上一个队伍是X的记录(即转会发生的月份) transfers = df_unique[(df_unique['Team'] == 'Y') & (df_unique['prev_team'] == 'X')] # 5. 统计每个月份的转会人数 result = transfers.groupby('Month').size().reset_index(name='Count') print(result)
输出结果和方案一完全一致,而且逻辑更贴近实际转会场景。
优化后的优势
- 效率更高:减少了中间数据框的创建,用更少的分组/操作完成统计;
- 逻辑严谨:精准筛选出X→Y的转会,避免了反向转会的错误统计;
- 可读性强:每一步操作的目的清晰,后续维护更方便。
内容的提问来源于stack exchange,提问作者sharathnatraj
相关产品推荐
相关产品推荐

