Pandas从JSON列表字段创建city新列报TypeError如何解决?
错误原因
你调用df['details'].str.strip('[]')后,details列的内容会被处理为字符串格式的字典(例如"{'country': 'USA', 'city': 'NYC'}"),并非真正的Python字典对象,自然无法通过字典key的方式取值,才会触发TypeError: string indices must be integers报错。
理想实现方案
分两种场景处理:
- 如果你原始数据的
details列本身就是列表嵌套字典的Python对象类型,不需要做strip处理,直接取列表第一个元素的city字段即可:
df['city'] = df['details'].map(lambda x: x[0]['city']) # 更简洁的pandas内置写法: # df['city'] = df['details'].str[0].str.get('city')
- 如果你是从csv/文本文件读取的数据,
details列默认被解析为字符串格式的列表,需要先把字符串转为真实的Python对象再取值:
import ast # 先将字符串格式的列表转成真实的列表嵌套字典结构 df['details'] = df['details'].apply(ast.literal_eval) # 再提取city字段 df['city'] = df['details'].str[0].str.get('city')
补充建议
不要用strip处理结构化的字符串内容,一旦字段值本身包含[或]字符,会导致内容被误改,用ast.literal_eval解析结构化字符串是更稳妥的方案,安全性也远高于直接用eval。
内容的提问来源于stack exchange,提问作者Roy
相关产品推荐
相关产品推荐

