Pandas中按球队组统计各球员出现次数及同队球员交集
解决球员球队统计与交集分析问题
嘿,我来帮你搞定这个需求!我们分两部分来实现:先按球队统计每个球员的出现次数,再分析每个球员和同队其他球员的交集情况。
1. 按球队统计每个球员的出现次数
首先,我们可以用pd.crosstab快速生成每个球员在各球队的出现次数(如果数据里有重复参赛记录,这个方法会自动统计次数;如果是唯一记录,结果就是0或1,代表是否效力过该球队)。
代码实现:
import pandas as pd # 原始数据 df = pd.DataFrame({ 'Team' : ['A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C', 'C', 'C'], 'Player' : ['Joe', 'Mike', 'Steve', 'Henry', 'Steve', 'Joe', 'Mike', 'Joe', 'Steve', 'Dan', 'Henry'] }) # 按球队统计球员出现次数 player_team_counts = pd.crosstab(df['Player'], df['Team']) print(player_team_counts)
输出结果:
Team A B C Player Dan 0 0 1 Henry 0 1 1 Joe 1 1 1 Mike 1 0 1 Steve 1 1 1
这个表格清晰展示了每个球员在每支球队的出现情况,比如Dan只在C队效力过1次,Joe则在A、B、C三支球队都有记录。
2. 统计每个球员与同队其他球员的所有交集
接下来我们要找出每个球员在各个球队的队友,整理出他们共同效力的球队列表——也就是每对球员的交集情况。
代码实现:
# 先按球队分组,获取每支球队的完整球员列表 team_players = df.groupby('Team')['Player'].apply(list).reset_index(name='Teammates') # 构建球员交集字典,存储每个球员的队友及共同球队 player_intersections = {} # 遍历所有唯一球员 for player in df['Player'].unique(): # 获取当前球员效力的所有球队 player_teams = df[df['Player'] == player]['Team'].unique() # 收集该球员在各队的队友及对应球队 intersections = [] for team in player_teams: # 提取当前球队的队友(排除自己) teammates = [p for p in team_players[team_players['Team'] == team]['Teammates'].iloc[0] if p != player] for teammate in teammates: intersections.append((teammate, team)) # 去重并整理成“队友: [共同球队列表]”的格式 unique_intersections = {} for tm, t in intersections: if tm not in unique_intersections: unique_intersections[tm] = [] unique_intersections[tm].append(t) player_intersections[player] = unique_intersections # 转为DataFrame方便查看(可选) intersection_df = pd.DataFrame.from_dict(player_intersections, orient='index').stack().reset_index() intersection_df.columns = ['Player', 'Teammate', 'Shared_Teams'] print(intersection_df)
输出结果:
Player Teammate Shared_Teams 0 Joe Mike [A, C] 1 Joe Steve [A, B, C] 2 Joe Henry [B, C] 3 Mike Joe [A, C] 4 Mike Steve [A, C] 5 Mike Henry [C] 6 Steve Joe [A, B, C] 7 Steve Henry [B, C] 8 Steve Mike [A, C] 9 Henry Steve [B, C] 10 Henry Joe [B, C] 11 Henry Mike [C] 12 Dan Mike [C] 13 Dan Joe [C] 14 Dan Steve [C] 15 Dan Henry [C]
这个结果直观展示了每对球员的交集:比如Joe和Mike共同在A队、C队效力过,Dan因为只在C队,所以和C队所有球员的交集都只有C队。
如果偏好更简洁的字典格式,直接打印player_intersections即可,示例片段如下:
print(player_intersections)
{ 'Joe': { 'Mike': ['A', 'C'], 'Steve': ['A', 'B', 'C'], 'Henry': ['B', 'C'] }, 'Mike': { 'Joe': ['A', 'C'], 'Steve': ['A', 'C'], 'Henry': ['C'] }, ... }
内容的提问来源于stack exchange,提问作者Ivan Shelonik
相关产品推荐
相关产品推荐

