如何将DataFrame中的值与字典的键范围匹配并返回对应值?
匹配DataFrame数值与区间字典的高效方法
嘿,我来帮你搞定这个问题!你想把DataFrame里的数值和字典中的区间对应起来获取颜色,用循环迭代确实容易踩坑,而且pandas本身就有更简洁高效的向量化方法,完全不用手动遍历~
为什么你的循环可能不好用?
循环遍历DataFrame的每行数据不仅效率低(数据量大的时候特别明显),而且如果没处理好区间的边界判断,很容易出现匹配不到的情况。咱们换个更贴合pandas特性的方式来做。
推荐方法:用pd.cut()实现区间匹配
你的字典键是连续的数值区间,pd.cut()就是pandas专门用来处理这类区间划分的工具,完美适配你的需求。步骤如下:
- 从字典中提取区间的边界值和对应的颜色标签
- 用
pd.cut()把DataFrame的数值映射到对应的颜色
完整代码示例:
import pandas as pd colors = {range(0,50):"red",range(50,100):"blue", range(100,150):"green",range(150,200):"orange" ,range(200, 250):"purple", range(250,1000):"grey"} df = pd.DataFrame(data=[51,8,265,167], columns=['A']) # 提取区间的起始点,再加上最后一个区间的终点作为完整的边界列表 bins = [r.start for r in colors.keys()] + [list(colors.keys())[-1].stop] # 提取对应的颜色标签 labels = list(colors.values()) # 执行区间匹配,include_lowest=True确保第一个区间包含起始值0 df['color'] = pd.cut(df['A'], bins=bins, labels=labels, include_lowest=True) print(df)
运行后你会得到期望的结果:
A color 0 51 blue 1 8 red 2 265 grey 3 167 orange
如果你想试试循环的写法(不推荐大数据量)
要是你好奇循环怎么写才能成功,也可以用apply()结合自定义函数来实现,不过这个方法在数据量大的时候效率会很低:
def get_matching_color(x): for interval, color in colors.items(): if x in interval: return color # 处理不在任何区间的数值 return None df['color'] = df['A'].apply(get_matching_color)
小提示
pd.cut()的include_lowest=True非常重要,它能确保第一个区间(0-50)包含0这个起始值,不然0会被判定为不属于任何区间,返回NaN。- 你的区间是连续且不重叠的,刚好符合
pd.cut()的使用场景,如果区间有重叠,可能需要调整逻辑优先匹配某个区间。
内容的提问来源于stack exchange,提问作者Rene
相关产品推荐
相关产品推荐

