You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 08:30:54