使用lambda的defaultdict在Pandas map时报错:TypeError参数缺失
问题分析与解决
错误原因
你遇到的TypeError是因为defaultdict的默认工厂函数定义错误:
- 当pandas的
map方法使用字典(包括defaultdict)时,会对每个元素执行dict[x]操作 - 当元素
x不在defaultdict的键中时,defaultdict会调用你传入的默认工厂函数,但你写的lambda x: x.replace('$','')要求必须传入一个参数,而defaultdict调用默认工厂函数时不会传递任何参数,因此触发参数缺失的错误。
正确实现方式
方式1:用dict.get()替代defaultdict(推荐)
直接给map传一个lambda函数,利用字典的get方法处理匹配与未匹配的情况,代码更简洁直观:
d = { "$1": 500, "$1,001": 2500, "$15,001": 32500, "$50,001": 75000, "$100,001": 175000, "$250,001": 350000, "$500,001": 750000, "$1,000,001": 2000000, "$5,000,001": 10000000, "25,000,001": 25000000 } z.map(lambda x: d.get(x, x.replace('$', '')))
d.get(x, 默认值)会先尝试从字典中取x对应的值,取不到时返回后面的默认值(这里是去掉$后的字符串)。
方式2:自定义defaultdict类(如果一定要用defaultdict)
如果坚持要用defaultdict,需要重写它的__missing__方法,这个方法会在键不存在时被调用,并且会接收当前的键作为参数:
from collections import defaultdict class CustomDefaultDict(defaultdict): def __missing__(self, key): # 键不存在时,返回去掉$后的结果 return key.replace('$', '') amt_map = CustomDefaultDict(d) z.map(amt_map)
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

