从Pandas DataFrame的字典列表列提取指定键值的问题
解决方法
错误原因
你碰到的AttributeError: 'str' object has no attribute 'get',本质是location列里的元素不是真正的Python列表/字典,而是字符串形式的列表字典(比如本该是[{"Name":"北京"}, {"Name":"上海"}],实际存成了字符串"[{"Name":"北京"}, {"Name":"上海"}]"),直接对字符串调用字典的get()方法自然会报错。
分步解决
1. 把字符串解析为真实的列表/字典
用ast.literal_eval()把字符串格式的列表字典转成Python可操作的对象,这个方法比eval()更安全,不会执行恶意代码。
2. 提取Name值并生成逗号分隔字符串
遍历解析后的列表,取出每个字典里的Name值,再用逗号连接成字符串。
完整代码示例
import pandas as pd import ast # 示例DataFrame df = pd.DataFrame({ 'location': ['[{"Name":"北京"}, {"Name":"上海"}]', '[{"Name":"广州"}]'] }) # 第一步:解析字符串为列表字典 df['location'] = df['location'].apply(ast.literal_eval) # 第二步:提取Name并生成逗号分隔字符串,生成新列 df['location_names'] = df['location'].apply( lambda x: ', '.join([d.get('Name', '') for d in x]) )
异常处理(可选)
如果location列里存在格式不合法的字符串(比如解析失败),可以加try-except避免报错中断:
def extract_names(loc_data): try: # 如果是字符串先解析,已经是列表的话直接用 loc_list = ast.literal_eval(loc_data) if isinstance(loc_data, str) else loc_data # 过滤非字典元素,避免额外报错 return ', '.join([d.get('Name', '') for d in loc_list if isinstance(d, dict)]) except Exception: return '' df['location_names'] = df['location'].apply(extract_names)
内容的提问来源于stack exchange,提问作者glucosebat
相关产品推荐
相关产品推荐

