使用Python内置map()结合字典替换Pandas DataFrame中含分号分隔的字段值
问题根因说明
TypeError: 'dict' object is not callable报错根因:Python内置map()的第一个参数要求是可调用对象(比如函数),字典本身不属于可调用类型,不能直接传入。Pandas的Series.map()是框架单独做了适配,支持直接传入字典做值映射,二者实现逻辑完全不同,不要混用。- 你自定义的
swap函数没有写return语句,就算逻辑正确,apply后得到的结果也全是None。 - 你在循环里调用
map(notelist, y)时,y是单个编码字符串(比如Note2),内置map会迭代字符串的每个字符传入处理,完全不符合你的需求。
最简实现方案
直接改造自定义转换函数,拆分后逐个取值再拼接即可,代码如下:
notelist = {'Note1':'Desc1','Note2':'Desc2','Note3':'Desc3'} def swap(x): # 拆分每个编码,逐个映射后用分号拼接 return ';'.join([notelist[code] for code in x.split(';')]) df['noteText'] = df['NoteRef'].apply(swap)
如果存在编码不在字典中的场景,可以用get方法避免报错,找不到的编码保留原值:
def swap(x): return ';'.join([notelist.get(code, code) for code in x.split(';')])
更优的向量化实现(大数据量推荐)
逐行apply的性能在数据量较大时表现较差,可以用Pandas原生向量化操作实现,性能提升明显:
# 1. 拆分字符串为列表 -> 2. 拆分为单行单个编码 -> 3. 批量映射 -> 4. 按原索引分组拼接 df['noteText'] = df['NoteRef'].str.split(';')\ .explode()\ .map(notelist)\ .groupby(level=0)\ .agg(';'.join)
内容的提问来源于stack exchange,提问作者Bigboss01
相关产品推荐
相关产品推荐

