Python DataFrame中explode函数无法正常使用的问题
解决DataFrame中explode函数无效的问题
问题根源
你的category_for列表面呈现列表格式,但实际大概率是字符串类型(比如数据读取时未自动解析为Python列表/字典对象),导致explode无法识别并拆分元素,因此没有效果。
解决方案
先将字符串格式的列表转换为Python原生的列表+字典结构,再执行explode和列展开操作:
步骤1:导入必要模块
import pandas as pd import ast
步骤2:解析字符串为Python对象
# 将字符串格式的列表转换为实际的列表/字典结构 df['category_for'] = df['category_for'].apply(ast.literal_eval)
步骤3:执行explode并展开字典列
# 拆分列表中的每个字典元素 df_exploded = df.explode('category_for') # 将字典列拆分为id和name两列 df_final = pd.concat([df_exploded.drop('category_for', axis=1), df_exploded['category_for'].apply(pd.Series)], axis=1)
完整可运行代码
import pandas as pd import ast # 模拟你的原始数据 data = { 'pub_id': ['pub.1155807502', 'pub.1153826092', 'pub.1145064359', 'pub.1145747691', 'pub.1144315107'], 'category_for': [ "[{'id': '80003', 'name': '32 Biomedical and Clinical Sciences'}, {'id': '80045', 'name': '3202 Clinical Sciences'}]", "[{'id': '80003', 'name': '32 Biomedical and Clinical Sciences'}, {'id': '80232', 'name': '5202 Biological Psychology'}, {'id': '80045', 'name': '3202 Clinical Sciences'}, {'id': '80052', 'name': '3209 Neurosciences'}, {'id': '80023', 'name': '52 Psychology'}]", "[{'id': '80003', 'name': '32 Biomedical and Clinical Sciences'}, {'id': '80052', 'name': '3209 Neurosciences'}, {'id': '80045', 'name': '3202 Clinical Sciences'}]", "[{'id': '80003', 'name': '32 Biomedical and Clinical Sciences'}, {'id': '80052', 'name': '3209 Neurosciences'}, {'id': '80045', 'name': '3202 Clinical Sciences'}]", "[{'id': '80003', 'name': '32 Biomedical and Clinical Sciences'}, {'id': '80232', 'name': '5202 Biological Psychology'}, {'id': '80045', 'name': '3202 Clinical Sciences'}, {'id': '80052', 'name': '3209 Neurosciences'}, {'id': '80023', 'name': '52 Psychology'}]" ] } df = pd.DataFrame(data) # 解析字符串为Python对象 df['category_for'] = df['category_for'].apply(ast.literal_eval) # 执行拆分和展开 df_exploded = df.explode('category_for') df_final = pd.concat([df_exploded.drop('category_for', axis=1), df_exploded['category_for'].apply(pd.Series)], axis=1) print(df_final)
验证方法
可以先检查category_for列的元素类型,确认是否为字符串:
print(df['category_for'].apply(type).unique())
如果输出包含<class 'str'>,就说明必须先做解析操作才能让explode生效。
内容的提问来源于stack exchange,提问作者Clara HL
相关产品推荐
相关产品推荐

