Pandas DataFrame存储嵌套字典值时如何高效按行访问指定字段
解决方案
高效提取单字段(推荐)
直接使用pandas针对对象类型Series的索引访问器链式取键,是性能最优的单字段提取写法:
df['new_col'] = df['dicts'].str['Step_1'].str['Q']
该实现是pandas底层优化的向量化操作,不需要写逐行循环逻辑,执行效率比apply方案高一个数量级,数据量越大性能优势越明显。
批量展开所有嵌套字段(长期使用推荐)
如果后续需要频繁访问不同Step下的键值,更建议从根源上解决单元格存储字典的问题,用pd.json_normalize一次性把所有嵌套字典摊平为普通列,适配任意数量的Step层级:
# 展开dicts列的所有嵌套结构,嵌套键自动用.拼接为列名 flatten_cols = pd.json_normalize(df['dicts']) # 合并回原DataFrame df = pd.concat([df.drop(columns=['dicts']), flatten_cols], axis=1) # 后续直接按列名访问即可,无需任何逐行操作 df['Step_1.Q']
展开后所有字段都是普通的DataFrame列,后续做筛选、聚合等操作的性能都会远高于操作单元格内的字典。
常见写法问题说明
- 直接写
df[dicts]['Step_1']['Q']报错的原因:df['dicts']返回的是整列Series对象,直接对Series用[]索引时,pandas会优先查找匹配的列名,不会自动逐行解包单元格内的字典做键访问,自然无法得到预期结果。 - 自定义函数+
apply的写法虽然能得到正确结果,但本质是Python层面的逐行循环,没有用到pandas的向量化优化,仅适合临时处理小数据集,大数据量下性能很差。
内容的提问来源于stack exchange,提问作者Antonio Carnevali
相关产品推荐
相关产品推荐

