Pandas中用map映射列名到元组字典及缺失值处理问题
Pandas列名映射字典值为元组的问题解决
问题场景
当用字典对DataFrame列名做映射时,字典值为字符串时可正常返回nan作为缺失值,但值为元组时会触发类型错误:
正常运行的示例(字符串值字典)
import pandas as pd d = {'one': [1, 2], 'two': [3, 4], 'three':[3,3]} df = pd.DataFrame(data=d) recodes = {'one':'A', 'two':'B'} c = df.columns.map(recodes) # 输出: Index(['A', 'B', nan], dtype='object')
报错的示例(元组值字典)
recodes2 = {'one':('A','H'), 'two':('AB','HB')} c = df.columns.map(recodes2)
报错信息:
TypeError: Expected tuple, got float
期望输出:
MultiIndex([( 'A', 'H'), ( 'AB', 'HB'), ('_unknown', '_unknown')], )
问题解答
1. 为什么会报错?为什么不返回(nan, nan)作为默认值?
Pandas的Index.map()传入字典时,会调用字典的__getitem__方法查找键,找不到时默认返回nan。但当映射目标是元组类型时,nan是float类型,和元组类型不兼容,触发类型错误。而字符串场景下nan可以和字符串共存于object类型的Index中,因此不会报错。
2. 如何避免这个问题?
不要直接将字典传给map(),而是自定义映射函数,手动处理键不存在的情况,确保所有返回值类型统一(均为元组)。
3. 如何设置默认元组值?
利用字典的get()方法,在自定义函数中指定键不存在时返回的默认元组即可。
Pythonic解决方案
无需提前补全字典,直接在map()中配合lambda函数处理缺失值:
import pandas as pd d = {'one': [1, 2], 'two': [3, 4], 'three':[6,7], 'four':[8,9]} df = pd.DataFrame(data=d) # 针对三元组需求的示例 recodes3 = {'one':('one','A','H'), 'two':('two','AB','HB')} c = df.columns.map(lambda x: recodes3.get(x, (x, '_unknown', '_unknown'))) multi_idx = pd.MultiIndex.from_tuples(c) print(multi_idx)
输出结果:
MultiIndex([( 'one', 'A', 'H'), ( 'two', 'AB', 'HB'), ( 'three', '_unknown', '_unknown'), ( 'four', '_unknown', '_unknown')], )
如果是最初的二元组需求:
recodes2 = {'one':('A','H'), 'two':('AB','HB')} c = df.columns.map(lambda x: recodes2.get(x, ('_unknown', '_unknown'))) multi_idx = pd.MultiIndex.from_tuples(c) print(multi_idx)
输出:
MultiIndex([( 'A', 'H'), ( 'AB', 'HB'), ('_unknown', '_unknown'), ('_unknown', '_unknown')], )
这种方式直接在映射过程中处理缺失值,无需提前遍历列名补全字典,符合Python简洁风格的同时,保证了返回值类型统一,避免了类型错误。
内容的提问来源于stack exchange,提问作者JFerro
相关产品推荐
相关产品推荐

