如何对Python DataFrame中的数值按100区间进行分类?
数值区间分类问题解决
问题需求
需要将采集的数据按100间隔划分区间,分类为0-100、100-200、200-300等区间。
输入DataFrame:
import pandas as pd df = pd.DataFrame([112,341,234,78,154],columns=['value'])
数据展示:
value 0 112 1 341 2 234 3 78 4 154
期望输出:
value value_range 0 112 100-200 1 341 200-400 2 234 200-300 3 78 0-100 4 154 100-200
用户编写的错误代码:
df['value_range'] = df['value'].apply(lambda x:[a,b] if x>a and x<b for a,b in zip([0,100,200,300,400],[100,200,300,400,500]))
执行报错:
SyntaxError: invalid syntax
错误分析
你的lambda表达式语法逻辑错误,if条件与循环的顺序不符合Python语法规范,无法正常解析。针对这类数值分箱需求,更高效的方式是使用pandas内置的pd.cut方法,也可以修正lambda的写法实现。
解决方案
方法一:使用pd.cut(推荐)
pd.cut是pandas专门为数值分箱设计的函数,代码简洁且处理效率更高:
import pandas as pd df = pd.DataFrame([112,341,234,78,154],columns=['value']) # 定义区间边界与对应标签 bins = [0, 100, 200, 300, 400, 500] labels = ['0-100', '100-200', '200-300', '300-400', '400-500'] # 针对341需要归为200-400的需求,调整区间边界即可 bins_adjusted = [0, 100, 200, 400, 500] labels_adjusted = ['0-100', '100-200', '200-400', '400-500'] # right=False设置左闭右开区间,include_lowest=True确保0值被包含在第一个区间 df['value_range'] = pd.cut(df['value'], bins=bins_adjusted, labels=labels_adjusted, right=False, include_lowest=True) print(df)
执行输出:
value value_range 0 112 100-200 1 341 200-400 2 234 200-400 3 78 0-100 4 154 100-200
如果需要234归为200-300,直接使用初始的bins和labels即可。
方法二:修正lambda表达式写法
如果坚持用apply配合lambda,需要调整语法,用生成器+next()找到匹配的区间:
df['value_range'] = df['value'].apply( lambda x: next(f"{a}-{b}" for a, b in zip([0,100,200,300,400],[100,200,300,400,500]) if a <= x < b) )
这段代码会遍历所有区间,返回第一个满足a <= x < b的区间字符串。但数据量较大时,效率不如pd.cut。
内容的提问来源于stack exchange,提问作者Mainland
相关产品推荐
相关产品推荐

