在Pandas DataFrame中实现值范围映射的技术问询
解决方案:按区间映射生成新列
别担心,这种按区间批量映射的需求其实很常见,我给你两种简单好用的方法来实现:
方法1:使用pd.cut()(推荐)
pd.cut()是pandas专门为数值分箱设计的函数,完美匹配你的区间映射需求:
import pandas as pd import numpy as np # 生成示例DataFrame df = pd.DataFrame(data=np.random.randint(1,10,10), columns=['a']) # 定义区间边界和对应的映射值 bins = [0, 3, 7, 10] # 划分出(0,3]、(3,7]、(7,10]三个区间 labels = [1, 2, 3] # 生成新列b,include_lowest确保左边界被包含 df['b'] = pd.cut(df['a'], bins=bins, labels=labels, include_lowest=True)
参数说明:
bins:设置区间的分隔点,适配你需要的[1,3]、[4,7]、[8,10]三个范围include_lowest=True:让第一个区间包含左边界值,保证a=1、2、3能被正确归类labels:对应每个区间的映射结果
运行后你的DataFrame会变成类似这样:
a b 0 7 2 1 8 3 2 8 3 3 3 1 4 1 1 5 1 1 6 2 1 7 8 3 8 6 2 9 6 2
方法2:使用np.select()(更直观的条件判断)
如果想要更直白地写出每个区间的判断规则,np.select()会是个不错的选择:
# 定义每个区间的判断条件 conditions = [ df['a'].between(1, 3), df['a'].between(4, 7), df['a'].between(8, 10) ] # 对应每个条件的映射结果 choices = [1, 2, 3] # 生成新列b df['b'] = np.select(conditions, choices)
这种方法的优势是条件逻辑一目了然,完全贴合你描述的规则,不需要考虑分箱的开闭边界问题。
两种方法都能完美实现你的需求,你可以根据自己的习惯选择~
内容的提问来源于stack exchange,提问作者E. Sommer
相关产品推荐
相关产品推荐

