Pandas按分隔符拆分并展开id列失败,求问题排查与解决
问题分析与解决方法
一、初始代码的语法错误
你定义DataFrame时存在两处语法问题,会直接导致代码无法正常运行:
'index'的值应为列表[1, 2],你误写为1 , 2](缺少左方括号)'song'键值对末尾缺少逗号,破坏了字典的结构
修正后的DataFrame定义代码:
import pandas as pd df = pd.DataFrame({ 'index': [1, 2], 'artist': ['Elton John', 'Biffy Clyro'], 'song': ['Rocket Man', 'Bubbles'], 'id': ['B12, U6, Z5', 'H91, D293, P292'] })
二、行展开失败的原因及修正
1. 第一种写法的问题
你执行:
df['id'] = df['id'].str.split(", ") df.explode('id')
df.explode('id')会返回新的展开后DataFrame,但你没有将这个结果赋值给原变量或新变量,原df不会被修改,所以看起来没有行展开效果。
2. 第二种链式写法的问题
你执行:
df['id'] = df['id'].str.split(", ").explode('id')
这里的错误在于:str.split()返回的是包含列表的Series,调用explode()时(Series的explode方法不需要传参数),会生成一个长度大于原DataFrame的Series。直接赋值回df['id']时,Pandas会按索引匹配,仅保留原索引对应的第一个元素,所以你只看到每行的第一个id值。
正确的实现方式
方式一:分步赋值
# 拆分id列为列表 df['id'] = df['id'].str.split(", ") # 将展开后的结果赋值给原df,覆盖旧数据 df = df.explode('id') # 可选:重置索引,避免重复索引 df = df.reset_index(drop=True)
方式二:链式一步完成
df = df.assign(id=df['id'].str.split(", ")).explode('id', ignore_index=True)
执行后即可得到你预期的每行对应一个id值的表格。
内容的提问来源于stack exchange,提问作者WomT
相关产品推荐
相关产品推荐

