按国家分组划分URL百分位数类别,实现Classification列赋值
问题描述
基于URL、Country、Ranking三列数据,为每个国家的URL按Ranking升序排序后,新增Classification列,将每个国家的URL划分为三类:
- Top 20%(取前20%的URL)
- Next 12%(取接下来12%的URL,结果取整)
- Bottom 68%(剩余68%的URL)
示例:哥伦比亚有25个URL时,Top 20%对应前5个URL,Next12%对应接下来2个URL,Bottom68%对应剩余18个URL。
原代码问题分析
原代码存在两处核心逻辑错误:
- 排序时错误将
URL纳入分组键,导致每个URL单独排序,无法实现同一国家内所有URL按Ranking排序 - 使用全局
URL Count的分位数划分类别,而非针对每个国家独立计算比例阈值,完全不符合需求逻辑
修正后的代码
import pandas as pd import numpy as np # 构造示例数据集 data = pd.DataFrame([ ["URL1", "USA", 83], ["URL2", "China", 111], ["URL3", "USA", 111], ["URL4", "USA", 135], ["URL5", "China", 135], ["URL6", "USA", 135], ["URL7", "USA", 139], ["URL8", "China", 250], ["URL9", "USA", 250], ["URL10", "USA", 369], ["URL11", "United Kingdom", 369], ["URL12", "Japan", 401], ["URL13", "USA", 401], ["URL14", "Azerbaijan", 2664], ["URL15", "Azerbaijan", 4473], ["URL16", "Armenia", 10922], ["URL17", "South Africa", 21692], ["URL18", "South Africa", 22305], ["URL19", "South Africa", 23137], ["URL20", "Armenia", 981629], ["URL21", "Argentina", 999689], ["URL22", "Morocco", 999732], ["URL23", "Indonesia", 999919], ["URL24", "Netherlands", 999976], ["URL25", "India", 99999999], ["URL26", "France", 99999999], ["URL27", "France", 99999999] ], columns=["URL", "Country", "Ranking"]) # 1. 按Country分组,每组内按Ranking升序排序 data = data.groupby('Country', group_keys=False).apply(lambda x: x.sort_values('Ranking', ascending=True)) # 2. 计算每个国家的URL总数,并标记组内位置(从1开始计数) data['URL Count'] = data.groupby('Country')['URL'].transform('count') data['Group Position'] = data.groupby('Country').cumcount() + 1 # 3. 定义每组的分类逻辑 def classify_group(group): total = group['URL Count'].iloc[0] top_num = int(round(total * 0.2)) next_num = top_num + int(round(total * 0.12)) conditions = [ group['Group Position'] <= top_num, group['Group Position'] <= next_num ] choices = ['1. Top 20%', '2. Next 12%'] group['Classification'] = np.select(conditions, choices, default='3. Bottom 68%') return group # 4. 应用分类逻辑到所有国家分组 categorized_data = data.groupby('Country', group_keys=False).apply(classify_group) # 5. 提取目标列 categorized_data = categorized_data[['Country', 'URL', 'Ranking', 'Classification']] # 输出结果 print(categorized_data)
代码说明
- 排序逻辑:仅按
Country分组,每组内按Ranking升序排列,确保同一国家的URL按排名顺序处理 - 阈值计算:针对每个国家独立计算Top20%和Next12%的数量,使用
round函数取整 - 位置标记:用
cumcount()标记每个URL在所属国家组内的位置,方便判断所属类别 - 分类逻辑:使用
np.select实现多条件判断,清晰划分三个类别
内容的提问来源于stack exchange,提问作者GIRIXH
相关产品推荐
相关产品推荐

