如何在Pandas中快速从字典列提取信息生成新列?
优化Pandas大数据集下从字典列提取对应键值的效率
问题场景
有大型Pandas DataFrame,需根据words列的键,从dict1列的字典中提取对应值并新增value列。原使用apply方法速度极慢,np.vectorize遇NaN报错,需高效解决方案。
最优高效方案(向量化操作)
利用Pandas的lookup方法结合字典展开,完全向量化处理,速度远超逐行循环:
# 将dict1列的字典批量展开为DataFrame dict_expanded = pd.DataFrame(df['dict1'].tolist(), index=df.index) # 按行索引和words列的键匹配提取值 df['value'] = dict_expanded.lookup(df.index, df['words'])
该方法自动处理NaN值,且无逐行循环开销,大数据集下效率提升显著。
备选高效方案(列表推导式)
若字典键差异极大、展开后会产生大量空列,可使用列表推导式,纯Python循环开销远低于apply:
df['value'] = [d.get(w) for d, w in zip(df['dict1'], df['words'])]
dict.get()方法可安全处理键不存在的情况(返回None,可后续转为NaN),同时保留足够效率。
为什么原方案效率低?
apply(axis=1)本质是逐行循环,Pandas在逐行处理时会产生大量额外开销,大数据集下速度极慢;np.vectorize并非真正的向量化实现,底层仍为循环,且对NaN的处理逻辑不够适配,易报错。
示例验证
使用提问中的测试数据:
import pandas as pd import numpy as np data = { 'ID': ['x12_12', 'x12_12', 'x12_12', 'x12_12'], 'ID2': [12984, 12984, 20934, 20934], 'words': ['apple', 'pear', 'orange', 'pear'], 'dict1': [{'apple':5, 'pear':10}, {'apple':5, 'pear':10}, {'orange':20, 'pear':np.nan}, {'orange':20, 'pear':np.nan}] } df = pd.DataFrame(data)
执行上述任一方案后,df将生成预期的value列,包含正确数值及NaN。
内容的提问来源于stack exchange,提问作者Sarah
相关产品推荐
相关产品推荐

