如何高效从DataFrame嵌套字典提取指定字段?含get()方法使用疑问
嘿,这个需求太常见了!你现在用try-except的方法虽然可行,但确实有点繁琐,用get()来处理嵌套字典的提取绝对是更优雅高效的选择,我来给你捋两种好用的实现方式:
方法一:链式调用get() + pandasapply
直接利用get()的默认值参数,逐层处理嵌套结构,同时结合pandas的apply函数批量处理整列数据,代码非常简洁:
# 直接生成新列存储提取的地址 testing['addresses'] = testing['Results_dict'].apply( lambda x: x.get('result', {}).get('Address', 'No info') )
解释一下逻辑:
- 对
Results_dict列的每个字典对象x,先调用x.get('result', {}):如果当前字典里没有'result'这个键,就返回一个空字典{}(而不是抛出KeyError),这样后续的操作不会报错。 - 接着对第一步的结果(要么是
'result'对应的子字典,要么是空字典)调用.get('Address', 'No info'):如果存在'Address'键就取对应的值,不存在就返回默认的'No info'。
这种方法比手动写for循环高效得多,因为pandas的apply内部做了优化,而且代码量少,可读性也更强。
方法二:用pd.json_normalize展开嵌套字典
如果你需要提取多个嵌套字段(比如同时取Address、website、status),用json_normalize把嵌套字典直接展开成DataFrame的列会更方便:
# 把Results_dict列的嵌套字典展开成平级列 normalized_df = pd.json_normalize(testing['Results_dict']) # 提取result.Address列,缺失值用'No info'填充 testing['addresses'] = normalized_df['result.Address'].fillna('No info')
优势:
展开后你可以直接通过列名(比如result.website、result.status)提取其他字段,一次处理所有需要的嵌套数据,不用重复写链式get,适合多字段提取的场景。
两种方法都能替代原来的try-except循环,效率和可读性都更好,你可以根据自己的需求选~
内容的提问来源于stack exchange,提问作者mathgeek
相关产品推荐
相关产品推荐

