如何在Pandas链式操作中将DataFrame的列表类型列拆分为多列
在Pandas链式操作中拆分列表类型列的正确方法
嘿,我看到你在尝试用Pandas链式操作拆分列表列时踩坑了,咱们来把这个问题理顺~
你的代码问题出在哪?
你原来的代码里,链式操作的第二行直接写了pd.DataFrame(df2['teams'].to_list(), ...),这里有两个核心问题:
- 语法错误:链式操作里应该调用DataFrame的方法,而不是直接写
.pd.DataFrame(...),这会让Python报错找不到该属性; - 上下文断裂:你直接引用了外部的
df2变量,没有利用链式管道中前一步的结果,这违背了链式操作的初衷,也会导致后续如果管道里的DataFrame有变化时,这一步无法同步更新。
两种正确的链式实现方法
下面给你两种符合链式操作逻辑的写法,都能得到你想要的结果:
方法1:用join结合lambda(适合列表长度固定的场景)
这种方法会把拆分后的新列和原DataFrame合并,全程依赖链式上下文:
import pandas as pd d1 = { 'teams': [['SF', 'NYG'],['SF', 'NYG'],['SF', 'NYG']], 'bal':[5,7,8] } df2 = pd.DataFrame(d1) res = (df2 # 用lambda获取当前管道的DataFrame,拆分列表列并指定列名 .join(lambda x: pd.DataFrame(x['teams'].tolist(), columns=['team1', 'team2'], index=x.index)) # 添加bal2列,用lambda引用当前管道的bal列 .assign(bal2=lambda x: x['bal'] * 2) # 可选:如果不需要原teams列,就删掉它 .drop('teams', axis=1) ) print(res)
方法2:用assign直接生成拆分列(更简洁直观)
如果你的列表列每个元素长度固定(都是2个元素),可以直接用str[]索引提取元素,代码更短:
res = (df2 # 分别生成team1和team2列 .assign(team1=lambda x: x['teams'].str[0], team2=lambda x: x['teams'].str[1]) # 添加bal2列 .assign(bal2=lambda x: x['bal'] * 2) # 可选:删除原teams列 .drop('teams', axis=1) )
最终结果
运行上面的代码后,你会得到和期望完全一致的DataFrame:
team1 team2 bal bal2 0 SF NYG 5 10 1 SF NYG 7 14 2 SF NYG 8 16
这样的链式操作既保持了代码的可读性,也能顺利衔接后续的其他操作步骤~
内容的提问来源于stack exchange,提问作者Zeus
相关产品推荐
相关产品推荐

