从DataFrame列中移除包裹字典的方括号
解决DataFrame列中字典被方括号包裹的提取问题
你用str.strip('[]')出现NaN,核心原因是这列元素类型不对——要么是Python列表(非字符串),要么是字符串形式的列表但直接strip没法解析成字典。下面分两种场景给出可行方案:
场景1:列元素是Python列表(每个单元格是长度为1的列表)
如果单元格里是实际的列表对象(比如[{'name': 'Steve', ...}]),直接提取列表的第一个元素即可:
# 方法1:遍历处理空值兼容场景 df['目标列名'] = df['目标列名'].apply(lambda x: x[0] if isinstance(x, list) and len(x) > 0 else x) # 方法2:pandas内置列表索引操作,更简洁 df['目标列名'] = df['目标列名'].str[0]
这个操作会完整保留字典的嵌套结构(包括country、state这类子字典)。
场景2:列元素是字符串形式的列表
如果单元格里是字符串(比如"[{'name': 'Steve', ...}]"),需要先把字符串解析为Python对象,再提取字典:
import ast df['目标列名'] = df['目标列名'].apply(lambda x: ast.literal_eval(x)[0] if isinstance(x, str) else x)
这里用ast.literal_eval替代strip,能安全地将字符串转为列表,再取第一个元素得到可用的字典,避免了strip后仍为字符串的问题。
测试示例
用你提供的数据验证场景1:
import pandas as pd data = { 'info': [ [{'name': 'Steve', 'type': 'Candy', 'likes': '2', 'confidence': '0', 'country': {'confidence': '0.0', 'abrv': 'STV', 'name': 'USA'}, 'region': 'North Amercica', 'subregion': 'Southern Asia', 'state': {'confidence': '0.0', 'numer': '0000', 'name': 'Sindh'}, 'class': 'High School'}] ] } df = pd.DataFrame(data) df['info'] = df['info'].str[0] print(df['info'].iloc[0])
输出就是完整的嵌套字典,没有任何信息丢失。
内容的提问来源于stack exchange,提问作者nat-zad
相关产品推荐
相关产品推荐

