Pandas DataFrame列分类:混合格式大学排名的分类处理问题
解决DataFrame中混合格式大学排名的归类问题
这问题我之前处理过类似的,用Pandas就能轻松搞定。核心思路是先统一处理每个排名值(不管是数字还是范围字符串),再精准映射到你需要的目标区间,具体步骤如下:
1. 定义目标区间的映射规则
先把你要求的16个目标区间整理成一个便于判断的结构,每个元组包含区间的起始值、结束值和最终要显示的区间名称:
import pandas as pd # 定义目标区间规则:(起始值, 结束值, 目标区间名称) rank_bins = [ (1, 10, "1-10"), (11, 20, "11-20"), (21, 30, "21-30"), (31, 40, "31-40"), (41, 50, "41-50"), (51, 60, "51-60"), (61, 70, "61-70"), (71, 80, "71-80"), (81, 90, "81-90"), (91, 100, "91-100"), (101, 150, "101-150"), (151, 200, "151-200"), (201, 300, "201-300"), (301, 400, "301-400"), (401, 500, "401-500"), (501, float("inf"), ">500") ]
2. 编写自定义处理函数
写一个函数来处理单个排名值,覆盖所有可能的格式情况(数字、范围字符串、>500):
def map_rank_to_bin(rank): # 直接匹配>500的情况 if rank == ">500": return ">500" # 处理已经是范围格式的排名(比如101-150),直接返回原字符串即可 if "-" in str(rank): return str(rank) # 处理单个数字格式的排名,转成整数后匹配对应区间 try: rank_num = int(rank) for start, end, bin_name in rank_bins: if start <= rank_num <= end: return bin_name except ValueError: # 遇到异常格式(比如空值、乱码)时返回默认值,可根据需求修改 return "未知"
3. 应用函数生成新列
假设你的DataFrame名为df,直接用apply函数生成新的归类列:
# 先构造你的示例数据 data = {"Uni_Rank": ["1", "3", "4", "101-150", "20", "22", "151-200", "201-300", "301-400", "10", "15", "44", "53", "70", ">500"]} df = pd.DataFrame(data) # 生成新的归类列Rank_Category df["Rank_Category"] = df["Uni_Rank"].apply(map_rank_to_bin) # 查看结果 print(df)
验证结果
运行后会得到符合预期的输出:
Uni_Rank Rank_Category 0 1 1-10 1 3 1-10 2 4 1-10 3 101-150 101-150 4 20 11-20 5 22 21-30 6 151-200 151-200 7 201-300 201-300 8 301-400 301-400 9 10 1-10 10 15 11-20 11 44 41-50 12 53 51-60 13 70 61-70 14 >500 >500
额外优化建议
- 如果你的
Uni_Rank列是混合类型(部分是int,部分是str),函数里的str(rank)会自动兼容,无需额外转换 - 若数据量极大,
apply的效率可能不够,可以改用pd.cut结合预处理逻辑,但对于绝大多数场景,apply已经足够简洁好用 - 可以根据实际需求修改异常值的返回结果,比如改成空值或者其他标识
内容的提问来源于stack exchange,提问作者BKS
相关产品推荐
相关产品推荐

