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

按国家分组划分URL百分位数类别,实现Classification列赋值

问题描述

基于URL、Country、Ranking三列数据,为每个国家的URL按Ranking升序排序后,新增Classification列,将每个国家的URL划分为三类:

    1. Top 20%(取前20%的URL)
    1. Next 12%(取接下来12%的URL,结果取整)
    1. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 22:14:53