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

如何拆分Pandas DataFrame中的列表列至独立单元格?

拆分Pandas DataFrame中列的列表为独立单元格的方法

嘿,这个需求我日常处理Pandas数据时经常碰到,给你分享几个简单靠谱的实现方法,按需选就行:

方法1:使用apply(pd.Series)(通用首选)

这是最通用的方法,不管列表长度是否固定都能处理,会自动把列表的每个元素拆成新列,长度不足的行自动补NaN。

先构造你给出的示例DataFrame:

import pandas as pd

df = pd.DataFrame({
    'idpso': [[1.0290574795443606, 20000, 3.515564441680908]],
    'pso': [[0.041787490144988726, 20000, 11.214858293533325]]
})

然后拆分每一列并合并结果:

# 拆分idpso列,给新列命名为idpso_0、idpso_1...
idpso_split = df['idpso'].apply(pd.Series).rename(columns=lambda idx: f'idpso_{idx}')
# 拆分pso列,同理命名
pso_split = df['pso'].apply(pd.Series).rename(columns=lambda idx: f'pso_{idx}')
# 合并所有拆分后的列
final_df = pd.concat([idpso_split, pso_split], axis=1)

运行后你会得到每个列表元素单独占据一个单元格的DataFrame,完美符合需求。

方法2:直接用str索引提取(适合列表长度固定的场景)

如果确定所有行的列表长度都一致(比如都是3个元素),直接通过索引提取元素会更高效,代码也更直观:

# 提取idpso列的每个元素到新列
df['idpso_val1'] = df['idpso'].str[0]
df['idpso_val2'] = df['idpso'].str[1]
df['idpso_val3'] = df['idpso'].str[2]

# 提取pso列的每个元素到新列
df['pso_val1'] = df['pso'].str[0]
df['pso_val2'] = df['pso'].str[1]
df['pso_val3'] = df['pso'].str[2]

# 可选:删除原来的列表列
final_df = df.drop(['idpso', 'pso'], axis=1)

这种方法性能比apply更好,适合数据量较大且列表长度固定的情况。

方法3:使用json_normalize(适合复杂嵌套场景)

如果你的数据还有更复杂的嵌套结构,json_normalize会是个不错的选择,不过针对纯列表的情况需要稍微转换一下格式:

from pandas import json_normalize

# 把列表转成带键的字典,再归一化
idpso_norm = json_normalize(df['idpso'].apply(lambda x: {f'idpso_{i}': val for i, val in enumerate(x)}))
pso_norm = json_normalize(df['pso'].apply(lambda x: {f'pso_{i}': val for i, val in enumerate(x)}))

final_df = pd.concat([idpso_norm, pso_norm], axis=1)

这个方法灵活性高,但对于简单列表来说,前两种方法更简洁。

小提示

如果你的DataFrame中存在列表长度不一致的行,apply(pd.Series)会自动在缺失的位置填充NaN,你可以用final_df.fillna(0)或者其他逻辑处理这些缺失值。

内容的提问来源于stack exchange,提问作者Diego Thuran

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:34:06