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

如何在Pandas链式操作中将DataFrame的列表类型列拆分为多列

在Pandas链式操作中拆分列表类型列的正确方法

嘿,我看到你在尝试用Pandas链式操作拆分列表列时踩坑了,咱们来把这个问题理顺~

你的代码问题出在哪?

你原来的代码里,链式操作的第二行直接写了pd.DataFrame(df2['teams'].to_list(), ...),这里有两个核心问题:

  1. 语法错误:链式操作里应该调用DataFrame的方法,而不是直接写.pd.DataFrame(...),这会让Python报错找不到该属性;
  2. 上下文断裂:你直接引用了外部的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.01 00:59:08