Python中如何按指定分隔符将DataFrame列拆分为多行
问题根因
你之前的代码没生效是因为str.split('-', expand=True)会把拆分出的多个位置值生成单独的列,直接赋值给原position列时只会取拆分后的第一个值,根本不会生成新行,和你的需求完全不匹配。
可行实现方案
pandas 0.25及以上版本可以直接用内置的explode方法实现列表拆行,逻辑简单性能好,两步就能完成处理:
- 先把
position列的复合值按-拆分为列表,不要加expand参数 - 对拆分后的列表列执行展开操作,pandas会自动复制对应行其余所有字段的取值,生成独立新行
对应代码:
# 拆分复合位置为列表 finals_nba['position'] = finals_nba['position'].str.split('-') # 展开为独立行并重置索引 finals_nba_expanded = finals_nba.explode('position', ignore_index=True)
处理后你提到的Curly Armstrong的G-F位置记录,会自动拆分为两行:一行position为G,一行position为F,name、born、Points Per Game三个字段的取值和原记录完全一致,符合预期。
后续统计实现
拆分完成后,要统计F、C、G三个位置场均得分最高的球员,直接执行以下代码即可:
# 先按场均得分降序排序,再按位置去重保留第一条(即得分最高的记录) top_score_players = finals_nba_expanded.sort_values('Points Per Game', ascending=False)\ .drop_duplicates(subset='position', keep='first')
如果你的环境pandas版本低于0.25,没有explode方法,可以用以下兼容写法:
import numpy as np # 计算每个复合位置拆分后的行数 position_lens = finals_nba['position'].str.len() # 生成展开后的新DataFrame finals_nba_expanded = pd.DataFrame({ 'name': np.repeat(finals_nba['name'], position_lens), 'born': np.repeat(finals_nba['born'], position_lens), 'position': np.concatenate(finals_nba['position'].values), 'Points Per Game': np.repeat(finals_nba['Points Per Game'], position_lens) })
内容的提问来源于stack exchange,提问作者Riten Bhagra
相关产品推荐
相关产品推荐

