如何在Pandas中拆分分号分隔列并复制行以统计球员数据?
问题描述
我有如下结构的Pandas DataFrame:
play_by_play = pd.DataFrame([{ "players": "Tom Brady; Mike Evans; Tristan Wirfs; Leonard Fournette; Chris Godwin", "down": 1, "to_go": 10, "play_type": 'pass', "yards_gained": 8, "pass_attempt": 1, "complete_pass": 1, "rush_attempt": 0 }])
我希望通过group by和聚合函数统计球员在场上的各项数据。手动单球员统计可使用play_by_play["players"].str.contains("Tom Brady")过滤后聚合,但我需要实现自动化处理。目前设想的方案是拆分"players"列,将每个球员对应为单独一行,其他列数据保持不变,最终效果如下:
| player | down | to_go | play_type | yards_gained | pass_attempt | complete_pass | rush_attempt |
|---|---|---|---|---|---|---|---|
| "Tom Brady" | 1 | 10 | pass | 8 | 1 | 1 | 0 |
| "Mike Evans" | 1 | 10 | pass | 8 | 1 | 1 | 0 |
| "Tristan Wirfs" | 1 | 10 | pass | 8 | 1 | 1 | 0 |
| "Leonard Fournette" | 1 | 10 | pass | 8 | 1 | 1 | 0 |
| "Chris Godwin" | 1 | 10 | pass | 8 | 1 | 1 | 0 |
请问如何实现该需求?此方案需支持数千行数据的可扩展性,若有更简便的按分号分隔列中的唯一值分组的方法,也欢迎采用。
解决方案
方法一:拆分players列并展开行(推荐,高效支持大数据量)
使用Pandas的str.split结合explode方法,一步完成拆分和行展开,该方法性能优异,适合数千行甚至更大规模的数据:
# 拆分players列,按分号+空格分割生成列表 play_by_play['player'] = play_by_play['players'].str.split('; ') # 展开列表,每个球员对应一行,其余列保留原数据 expanded_df = play_by_play.explode('player').drop('players', axis=1)
执行后expanded_df就是目标格式,之后可直接按player列分组聚合:
# 示例:按球员统计各项数据总和 player_stats = expanded_df.groupby('player').agg({ 'down': 'count', # 统计出场次数 'yards_gained': 'sum', 'pass_attempt': 'sum', 'complete_pass': 'sum', 'rush_attempt': 'sum' }).reset_index()
方法二:处理不规范分隔符的兼容方案
如果players列的分隔符不统一(比如存在仅分号无空格的情况),可以先清洗数据再拆分:
# 先去除球员名前后空格,再拆分 play_by_play['player'] = play_by_play['players'].str.split(';').apply(lambda x: [p.strip() for p in x]) expanded_df = play_by_play.explode('player').drop('players', axis=1)
注意事项
explode方法要求Pandas版本在0.25及以上,若版本较低,可使用以下代码替代(性能略逊):
expanded_df = play_by_play.assign(player=play_by_play['players'].str.split('; ')).apply(pd.Series.explode)
内容的提问来源于stack exchange,提问作者jwald3
相关产品推荐
相关产品推荐

