Pandas解析DataFrame:拆分列表字段为多行并匹配对应表名
问题原因
你之前使用的多列拆分代码失效,核心原因是Field_Names列存储的不是原生Python列表对象,而是字符串格式的列表文本。
当列内元素是字符串而非可迭代的列表时,调用apply(pd.Series)会把整个字符串识别为单个值,无法按列表元素拆分;同时Table_Name列本身就是普通字符串值,两列拆分后再拼接,自然和原输入完全一致。
正确实现方法
分两步处理即可:
- 先将字符串格式的列表文本转为原生Python列表
- 对列表列做行展开,自动重复填充对应的
Table_Name值
推荐写法(pandas 0.25及以上版本支持)
用pandas内置的explode方法实现,代码最简洁:
import pandas as pd import ast # 安全转换字符串格式的列表为原生列表对象 df['Field_Names'] = df['Field_Names'].apply(ast.literal_eval) # 按列表元素拆分为行,重置索引 df_parsed = df.explode('Field_Names', ignore_index=True)
老版本pandas兼容写法
如果你的pandas版本低于0.25没有explode方法,可以用修正后的stack逻辑实现:
import pandas as pd import ast df['Field_Names'] = df['Field_Names'].apply(ast.literal_eval) df_parsed = df.set_index('Table_Name')['Field_Names']\ .apply(pd.Series).stack()\ .reset_index(level=1, drop=True)\ .reset_index(name='Field_Names')
处理完成后输出的结果完全符合预期:每个字段名单独占一行,对应Table_Name自动重复填充,总列数保持2列不变。
注意:不要直接用
eval()转换字符串列表,ast.literal_eval()只会解析合法的Python字面量,不会执行任意代码,安全性更高。
内容的提问来源于stack exchange,提问作者BlueHawk77
相关产品推荐
相关产品推荐

