如何在Pandas中根据数值所在区间分配对应数值?
解决Pandas Series区间映射的语法与逻辑问题
问题背景
给定如下Pandas Series:
import pandas as pd amount = pd.Series([25.35, 30.0, 23.13, 100.0, 75.0])
需要按规则映射数值:每25对应3,即25≤x<50→3,50≤x<75→6,75≤x<100→9,100≤x<125→12,小于25→0,最终生成如下DataFrame:
amount number 0 25.35 3.0 1 30.00 3.0 2 23.13 0.0 3 100.00 12.0 4 75.00 9.0
原代码的问题
你编写的函数存在语法错误和逻辑错误:
- 语法错误:条件判断写法不符合Python规范,比如
elif >= 50 x < 75,必须明确写出变量x,正确格式应为elif 50 <= x < 75。 - 逻辑错误:
apply方法会将Series的每个元素单独传入函数,无需在函数内部遍历整个Series;原函数的for x in amount会导致仅处理第一个元素就返回,后续元素无法被处理。 - 条件方向错误:
if 25 >= x < 50实际判断的是x <25,与需求完全相反,应改为25 <= x <50。 - 返回值缺失:
else分支用pass会导致函数返回None,不符合小于25返回0的需求。
修正方案
方案1:修正函数后使用apply
import pandas as pd amount = pd.Series([25.35, 30.0, 23.13, 100.0, 75.0]) def map_number(x): if 25 <= x < 50: return 3 elif 50 <= x < 75: return 6 elif 75 <= x < 100: return 9 elif 100 <= x < 125: return 12 else: return 0 # 生成结果DataFrame result = pd.DataFrame({'amount': amount, 'number': amount.apply(map_number)}) print(result)
方案2:更高效的数学计算法
由于映射规则是每25对应3的倍数,可直接用整除运算实现,避免多条件判断,效率更高:
import pandas as pd amount = pd.Series([25.35, 30.0, 23.13, 100.0, 75.0]) # 核心逻辑:x整除25后乘以3,小于25的数整除结果为0,正好返回0 number = (amount // 25) * 3 result = pd.DataFrame({'amount': amount, 'number': number}) print(result)
两种方案都能得到符合预期的输出结果,方案2在数据量较大时性能更优。
内容的提问来源于stack exchange,提问作者Alejandro L
相关产品推荐
相关产品推荐

