基于字典列表为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
相关产品推荐
相关产品推荐

