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

基于字典列表为Pandas DataFrame新增列时apply函数执行失败如何解决

错误原因
  • lambda表达式返回的是生成器对象而非具体值:lambda x: d['source_desc'] for d in di if d['source_id'] == x属于生成器推导式,没有完成实际求值,直接赋值给DataFrame列只会存储生成器对象,不是你需要的source_desc文本值。
  • 变量名引用错误:你代码中循环遍历的di是用来创建dff的、仅包含source_id和city字段的字典列表,本身没有source_desc字段,根本取不到对应的描述值,你应该遍历最开始给出的、存储source_id和source_desc映射关系的字典列表。
最优实现方案

优先把映射关系转成字典,再用pandas内置的map方法匹配,效率远高于自定义apply:

import pandas as pd
# 定义id和描述的映射列表(就是你最开始给出的字典列表)
source_list = [{'source_id': '1', 'source_desc': 'XML1'},
 {'source_id': '2', 'source_desc': 'XML2'},
 {'source_id': '3', 'source_desc': 'XML3'}]
# 转换为id到描述的映射字典
source_map = {item['source_id']: item['source_desc'] for item in source_list}
# 你的原始DataFrame
di = [{'source_id': '1','city':'NY'},
       {'source_id': '2','city':'Santiago'},
       {'source_id': '3','city':'Berlin'}]
dff = pd.DataFrame(di)
# 匹配新增列
dff['source_desc'] = dff['source_id'].map(source_map)

运行后得到的dff就是你预期的结果。

如果你一定要用apply方法,正确写法如下,但这种写法每次匹配都要遍历整个映射列表,数据量大会非常慢,不推荐使用:

dff['source_desc'] = dff['source_id'].astype(str).apply(lambda x: next(d['source_desc'] for d in source_list if d['source_id'] == x))

内容的提问来源于stack exchange,提问作者JFerro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 04:12:01