如何在Pandas中对区间类型数据执行字典映射?
如何对Pandas分箱后的区间类型进行映射?
哈哈,这个问题我之前踩过坑!你遇到的问题本质是pd.cut生成的区间是Pandas的Interval对象,直接用手动写的区间当字典键会因为对象实例不匹配而映射失败,给你几个实用的解决办法:
方法一:分箱时直接指定标签(最省心)
既然我们最终要得到映射后的range字符串,完全可以在执行pd.cut的时候一步到位,不用后续再做映射操作:
import pandas as pd d = {'col1':['a','c','b','q','w','f','h','v','t','y'], 'col2':[1,3,33,7,5,8,2,3,5,0]} df= pd.DataFrame(d) # 定义分箱边界和对应的range标签 bins = [-0.001, 2.25, 4, 6.5, 33] range_labels = ["range 1", "range 2", "range 3", "range 4"] # 生成区间列col3 df['col3'] = pd.cut(x=df['col2'], bins=bins) # 直接生成映射后的col4 df['col4'] = pd.cut(x=df['col2'], bins=bins, labels=range_labels)
这样处理后,col3保留原始区间,col4直接得到我们想要的字符串,全程不用处理字典匹配问题。
方法二:将区间转为字符串后映射
如果已经生成了col3列,不想重新执行分箱,可以把Interval对象转成字符串,再用字符串作为字典键进行映射:
# 定义键为区间的字符串表示的字典 di = { "(-0.001, 2.25]": "range 1", "(2.25, 4.0]": "range 2", "(4.0, 6.5]": "range 3", "(6.5, 33.0]": "range 4" } # 把col3转为字符串后再映射 df['col4'] = df['col3'].astype(str).map(di)
这个方法的核心是利用Interval对象的字符串表示和我们手动写的格式完全一致,转成字符串后就能和字典键完美匹配。
方法三:利用Categorical的codes属性自动映射
pd.cut生成的区间列是Categorical类型,自带一个codes属性,每个区间会被分配一个从0开始的整数编码。我们可以利用这个编码直接生成对应的range字符串,连字典都不用写:
# 利用codes属性,编码+1就是range的数字 df['col4'] = df['col3'].cat.codes.apply(lambda x: f"range {x+1}")
这个方法尤其适合分箱区间很多的场景,不用手动维护庞大的映射字典,非常高效。
内容的提问来源于stack exchange,提问作者Wiliam
相关产品推荐
相关产品推荐

