如何拆分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
相关产品推荐
相关产品推荐

