You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

原代码的问题

你编写的函数存在语法错误和逻辑错误:

  1. 语法错误:条件判断写法不符合Python规范,比如elif >= 50 x < 75,必须明确写出变量x,正确格式应为elif 50 <= x < 75。
  2. 逻辑错误:apply方法会将Series的每个元素单独传入函数,无需在函数内部遍历整个Series;原函数的for x in amount会导致仅处理第一个元素就返回,后续元素无法被处理。
  3. 条件方向错误:if 25 >= x < 50实际判断的是x <25,与需求完全相反,应改为25 <= x <50。
  4. 返回值缺失: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 18:24:04