Python pandas使用.index.map()时报'Series' object is not callable错误
报错原因
Index.map()方法的入参仅支持两类:一是可调用对象(函数、实现了__call__方法的类实例),二是字典类型的映射表。你传入的DF2["Shortage"]是pandas Series对象,不属于上述两类,pandas执行逻辑时会尝试将传入的mapper当函数调用,因此抛出'Series' object is not callable错误。
正确实现方案
你要实现的是按JobKey做键值匹配的左连接映射,以下三种写法都可以实现,按需选择即可:
方案1:索引对齐直接赋值(适配你当前的代码逻辑,最简便)
你已经将两个DataFrame的JobKey设为索引,pandas做Series赋值时会自动按索引对齐匹配,不需要额外调用map方法,直接赋值即可:# 匹配不到的JobKey对应行自动填充NaN,需要默认值可以接fillna DF1["Short"] = DF2["Shortage"].fillna(" ")方案2:字典映射(无需修改索引,逻辑最接近Excel VLOOKUP)
如果不想改动DataFrame原有索引,可以先把DF2的映射关系转为字典,再对DF1的JobKey列做map:# 不需要提前执行set_index操作 short_mapping = DF2.set_index('JobKey')['Shortage'].to_dict() DF1['Short'] = DF1['JobKey'].map(short_mapping).fillna(" ")方案3:左连接merge(适合需要匹配DF2多列的场景)
如果后续需要从DF2匹配不止Shortage一列,用左连接的方式扩展性更好,也不会出现索引错位问题:DF1 = DF1.merge( DF2[['JobKey', 'Shortage']], on='JobKey', how='left' ).rename(columns={'Shortage': 'Short'})
额外提示
你贴的示例代码里DF2 = pd.read.excel('...')存在笔误,正确的pandas读取Excel方法是pd.read_excel(),如果实际运行无报错应该是写示例时的手误,注意排查即可。
内容的提问来源于stack exchange,提问作者Alexis Nossovitch
相关产品推荐
相关产品推荐

