Python中对整数变量分类的正确方式?院校排名分组代码咨询
大学排名分组问题解答
原方法的合理性
你的这个自定义函数整体是合理的,能准确实现按排名区间分组的需求,但有几个小细节可以优化:
- 拼写笔误:
Unversity应该改成University - 逻辑运算符:Python里单个数值的逻辑判断用
and比&更合适(&是位运算符号,虽然这里也能运行,但语义上and更清晰) - 效率问题:如果用
df['ranking'].apply(create_category)处理大数据量的DataFrame,因为是逐行迭代,速度会比矢量化方法慢不少。
更高效的替代实现方式
1. 用pandas的cut函数(首推)
这是pandas专门为区间分箱设计的工具,矢量化处理效率极高,代码也更简洁:
import pandas as pd # 定义分箱边界和对应的等级标签 bins = [0, 100, 200, 300, float('inf')] tier_labels = [ "First Tier Top University", "Second Tier Top University", "Third Tier Top University", "Other Top University" ] # 直接生成分类列 df['tier'] = pd.cut(df['ranking'], bins=bins, labels=tier_labels, include_lowest=True)
include_lowest=True能确保排名1被包含在第一个区间里(因为cut默认是左开右闭,设置后第一个区间变为[0,100],包含两端边界)- 自动处理NaN值,会被标记为NaN,后续可以用
df['tier'].fillna("Other Top University")统一处理。
2. 用numpy的select函数
适合多条件分支的矢量化处理,效率同样远高于逐行apply:
import numpy as np # 定义条件列表和对应结果 conditions = [ (df['ranking'] >= 1) & (df['ranking'] <= 100), (df['ranking'] >= 101) & (df['ranking'] <= 200), (df['ranking'] >= 201) & (df['ranking'] <= 300) ] tier_choices = [ "First Tier Top University", "Second Tier Top University", "Third Tier Top University" ] # 生成分类列,不符合条件的默认归为其他 df['tier'] = np.select(conditions, tier_choices, default="Other Top University")
3. 优化原自定义函数
如果还是想用自定义函数的方式,可以优化细节:
def create_category(ranking): # 先处理非数值或空值的情况 if pd.isna(ranking) or not isinstance(ranking, (int, float)): return "Other Top University" # Python支持连续区间判断,写法更简洁 if 1 <= ranking <= 100: return "First Tier Top University" elif 101 <= ranking <= 200: return "Second Tier Top University" elif 201 <= ranking <= 300: return "Third Tier Top University" return "Other Top University" # 应用到DataFrame df['tier'] = df['ranking'].apply(create_category)
- 增加了对非数值和空值的处理,避免报错
- 简化了区间判断的写法(Python允许
a <= x <= b的连续判断) - 修正了拼写错误
内容的提问来源于stack exchange,提问作者Willybaldo
相关产品推荐
相关产品推荐

