You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 13:54:04