【Pandas】pandas GroupBy Function application DataFrameGroupBy.rank

Pandas2.2 GroupBy

DataFrameGroupBy computations descriptive stats

方法 描述
DataFrameGroupBy.all([skipna]) 用于检查分组中每个组的元素是否全部为 True(或非零、非空值)
DataFrameGroupBy.any([skipna]) 用于检查分组中每个组的元素是否至少有一个为 True(或非零、非空值)
DataFrameGroupBy.bfill([limit]) 用于对每个分组中的缺失值进行向后填充(backward fill)
DataFrameGroupBy.corr([method, min_periods, ...]) 用于计算每个分组内数值列之间的相关系数矩阵
DataFrameGroupBy.corrwith(other[, axis, ...]) 用于计算每个分组与另一个 DataFrame、Series 或 ndarray 对象之间的 pairwise 相关系数
DataFrameGroupBy.count() 用于计算每个分组中非缺失值(non-NA/null)的数量
DataFrameGroupBy.cov([min_periods, ddof, ...]) 用于计算每个分组内数值列之间的协方差矩阵
DataFrameGroupBy.cumcount([ascending]) 用于计算每个分组内元素的累积计数
DataFrameGroupBy.cummax([axis, numeric_only]) 用于计算每个分组内数值的累计最大值
DataFrameGroupBy.cummin([axis, numeric_only]) 用于计算每个分组内数值的累计最小值
DataFrameGroupBy.cumprod([axis]) 用于计算每个分组内数值的累计乘积
DataFrameGroupBy.cumsum([axis]) 用于计算每个分组内数值的累计和
DataFrameGroupBy.describe([percentiles, ...]) 用于生成分组数据的描述性统计信息
DataFrameGroupBy.diff([periods, axis]) 用于计算每个分组内数据的一阶或高阶差分
DataFrameGroupBy.ffill([limit]) 用于在每个分组内向前填充缺失值(NaN)
DataFrameGroupBy.fillna([value, method, ...]) 用于在每个分组内填充缺失值(NaN)
DataFrameGroupBy.first([numeric_only, ...]) 用于获取每个分组中第一行非空值的数据
DataFrameGroupBy.head([n]) 用于获取每个分组的前 n 行数据
DataFrameGroupBy.idxmax([axis, skipna, ...]) 用于返回每个分组中每列最大值的索引标签
DataFrameGroupBy.idxmin([axis, skipna, ...]) 用于返回每个分组中每列最小值的索引标签
DataFrameGroupBy.last([numeric_only, ...]) 用于返回每个分组的最后一个非空值
DataFrameGroupBy.max([numeric_only, ...]) 用于返回每个分组中的最大值
DataFrameGroupBy.mean([numeric_only, ...]) 用于计算每个分组的数值列的平均值
DataFrameGroupBy.median([numeric_only]) 用于计算每个分组的数值列的中位数
DataFrameGroupBy.min([numeric_only, ...]) 用于计算每个分组的数值列的最小值
DataFrameGroupBy.ngroup([ascending]) 用于返回每个组的整数标签
DataFrameGroupBy.nth 用于从每个分组中选择第 n 个元素
DataFrameGroupBy.nunique([dropna]) 用于计算每个分组中唯一值的数量
DataFrameGroupBy.ohlc() 用于计算每组的 OHLC(Open-High-Low-Close)值
DataFrameGroupBy.pct_change([periods, ...]) 用于计算每个分组内元素的百分比变化
DataFrameGroupBy.prod([numeric_only, min_count]) 用于计算每个分组内所有数值的乘积
DataFrameGroupBy.quantile([q, ...]) 用于计算每个分组的指定分位数
DataFrameGroupBy.rank([method, ascending, ...]) 用于对每个分组内的数据进行排名

pandas.DataFrameGroupBy.rank()

方法描述

pandas.DataFrameGroupBy.rank(method='average', ascending=True, na_option='keep', pct=False, axis=<no_default>) 是 DataFrameGroupBy 对象的一个方法,用于对每个分组内的数据进行排名。该方法会根据分组内的值大小分配排名,相同值会根据 method 参数的设置分配排名。

参数说明
  • method: {'average', 'min', 'max', 'first', 'dense'}, default 'average'

    • average: 相同值分配平均排名
    • dense: 相同值分配相同排名,后续排名递增1
  • ascending: bool, default True

    • True: 从小到大排名(1为最小值)
    • False: 从大到小排名(1为最大值)
  • na_option: {'keep', 'top', 'bottom'}, default 'keep'

    • keep: NaN 值保持 NaN 排名
    • top: NaN 值排在最前面
    • bottom: NaN 值排在最后面
  • pct: bool, default False

    • True: 返回百分位排名(排名/总数)
    • False: 返回标准排名
  • axis: int, default 0

    • 0: 按行分组排名
    • 1: 按列分组排名
返回值

返回一个与原始 DataFrame 索引相同的 DataFrame,包含每个元素的排名。

使用示例
python 复制代码
import pandas as pd
import numpy as np

# 示例1: 基本排名功能
print("=== 示例1: 基本排名功能 ===")
df = pd.DataFrame({
    'Category': ['A', 'A', 'B', 'B', 'A', 'B'],
    'Value': [10, 20, 15, 25, 5, 30]
})
print("原始数据:")
print(df)
print()

grouped = df.groupby('Category')
print("按Category分组排名:")
rank_result = grouped.rank()
print(rank_result)
print()

# 示例2: 不同排名方法
print("=== 示例2: 不同排名方法 ===")
df2 = pd.DataFrame({
    'Group': ['X', 'X', 'X', 'X', 'Y', 'Y', 'Y', 'Y'],
    'Score': [85, 90, 85, 95, 70, 80, 80, 90]
})
print("学生成绩数据:")
print(df2)
print()

grouped2 = df2.groupby('Group')
print("默认排名方法 (method='average'):")
avg_rank = grouped2.rank()
print(avg_rank)
print()

print("最小排名方法 (method='min'):")
min_rank = grouped2.rank(method='min')
print(min_rank)
print()

print("密集排名方法 (method='dense'):")
dense_rank = grouped2.rank(method='dense')
print(dense_rank)
print()

# 示例3: 降序排名
print("=== 示例3: 降序排名 ===")
print("降序排名 (ascending=False):")
desc_rank = grouped2.rank(ascending=False)
print(desc_rank)
print()

# 示例4: 百分位排名
print("=== 示例4: 百分位排名 ===")
print("百分位排名 (pct=True):")
pct_rank = grouped2.rank(pct=True)
print(pct_rank)
print()

# 示例5: 处理缺失值
print("=== 示例5: 处理缺失值 ===")
df_with_nan = pd.DataFrame({
    'Group': ['A', 'A', 'A', 'B', 'B', 'B'],
    'Value': [10, np.nan, 20, 15, 25, np.nan]
})
print("包含缺失值的数据:")
print(df_with_nan)
print()

grouped_nan = df_with_nan.groupby('Group')
print("保持NaN值排名 (na_option='keep'):")
keep_rank = grouped_nan.rank(na_option='keep')
print(keep_rank)
print()

print("NaN值排在最后 (na_option='bottom'):")
bottom_rank = grouped_nan.rank(na_option='bottom')
print(bottom_rank)
print()

# 示例6: 多列排名
print("=== 示例6: 多列排名 ===")
df_multi = pd.DataFrame({
    'Team': ['Red', 'Red', 'Red', 'Blue', 'Blue', 'Blue'],
    'Points': [25, 30, 25, 40, 35, 40],
    'Assists': [10, 12, 11, 8, 15, 8]
})
print("团队数据:")
print(df_multi)
print()

grouped_multi = df_multi.groupby('Team')
print("对Points和Assists分别进行组内排名:")
multi_rank = grouped_multi.rank()
print(multi_rank)
print()

# 示例7: 金融数据分析示例
print("=== 示例7: 金融数据分析示例 ===")
stock_data = pd.DataFrame({
    'Sector': ['Tech', 'Tech', 'Tech', 'Finance', 'Finance', 'Finance'],
    'Stock': ['AAPL', 'MSFT', 'GOOGL', 'JPM', 'BAC', 'GS'],
    'Return': [0.05, -0.02, 0.03, 0.01, -0.01, 0.02],
    'Volume': [1000000, 800000, 1200000, 500000, 600000, 700000]
})
print("股票数据:")
print(stock_data)
print()

grouped_stocks = stock_data.groupby('Sector')
print("按行业对收益率进行排名:")
return_rank = grouped_stocks.rank(method='first', ascending=False)
print(return_rank)
print()

# 示例8: 密集排名 vs 平均排名比较
print("=== 示例8: 密集排名 vs 平均排名比较 ===")
df_ties = pd.DataFrame({
    'Class': ['A', 'A', 'A', 'A', 'A'],
    'Score': [90, 90, 90, 85, 95]
})
print("有多个相同分数的数据:")
print(df_ties)
print()

grouped_ties = df_ties.groupby('Class')
print("平均排名 (method='average'):")
avg_ties = grouped_ties.rank()
print(avg_ties)
print()

print("密集排名 (method='dense'):")
dense_ties = grouped_ties.rank(method='dense')
print(dense_ties)
print()

# 示例9: 实际业务场景 - 销售排名
print("=== 示例9: 实际业务场景 - 销售排名 ===")
sales_data = pd.DataFrame({
    'Region': ['North', 'North', 'North', 'South', 'South', 'South', 'East', 'East', 'East'],
    'Salesperson': ['Alice', 'Bob', 'Charlie', 'David', 'Eve', 'Frank', 'Grace', 'Henry', 'Ivy'],
    'Sales': [150000, 180000, 160000, 200000, 170000, 190000, 140000, 155000, 165000],
    'Bonus': [15000, 18000, 16000, 20000, 17000, 19000, 14000, 15500, 16500]
})
print("销售数据:")
print(sales_data)
print()

grouped_sales = sales_data.groupby('Region')
print("按区域对销售业绩进行排名:")
sales_rank = grouped_sales.rank(method='first', ascending=False)
print(sales_rank)
print()

# 示例10: 排名结合其他统计
print("=== 示例10: 排名结合其他统计 ===")
print("添加排名信息到原始数据:")
result_with_rank = sales_data.copy()
result_with_rank['Sales_Rank'] = grouped_sales['Sales'].rank(method='first', ascending=False).astype(int)
result_with_rank['Bonus_Rank'] = grouped_sales['Bonus'].rank(method='first', ascending=False).astype(int)
print(result_with_rank)
执行结果
复制代码
=== 示例1: 基本排名功能 ===
原始数据:
  Category  Value
0        A     10
1        A     20
2        B     15
3        B     25
4        A      5
5        B     30

按Category分组排名:
   Value
0    2.0
1    3.0
2    1.0
3    2.0
4    1.0
5    3.0

=== 示例2: 不同排名方法 ===
学生成绩数据:
  Group  Score
0     X     85
1     X     90
2     X     85
3     X     95
4     Y     70
5     Y     80
6     Y     80
7     Y     90

默认排名方法 (method='average'):
   Score
0    1.5
1    3.0
2    1.5
3    4.0
4    1.0
5    2.5
6    2.5
7    4.0

最小排名方法 (method='min'):
   Score
0    1.0
1    3.0
2    1.0
3    4.0
4    1.0
5    2.0
6    2.0
7    4.0

密集排名方法 (method='dense'):
   Score
0    1.0
1    3.0
2    1.0
3    4.0
4    1.0
5    2.0
6    2.0
7    3.0

=== 示例3: 降序排名 ===
降序排名 (ascending=False):
   Score
0    3.0
1    2.0
2    3.0
3    1.0
4    4.0
5    2.5
6    2.5
7    1.0

=== 示例4: 百分位排名 ===
百分位排名 (pct=True):
   Score
0    0.375
1    0.750
2    0.375
3    1.000
4    0.250
5    0.625
6    0.625
7    1.000

=== 示例5: 处理缺失值 ===
包含缺失值的数据:
  Group  Value
0     A   10.0
1     A    NaN
2     A   20.0
3     B   15.0
4     B   25.0
5     B    NaN

保持NaN值排名 (na_option='keep'):
   Value
0    1.0
1    NaN
2    2.0
3    1.0
4    2.0
5    NaN

NaN值排在最后 (na_option='bottom'):
   Value
0    1.0
1    3.0
2    2.0
3    1.0
4    2.0
5    3.0

=== 示例6: 多列排名 ===
团队数据:
    Team  Points  Assists
0    Red      25       10
1    Red      30       12
2    Red      25       11
3   Blue      40        8
4   Blue      35       15
5   Blue      40        8

对Points和Assists分别进行组内排名:
   Points  Assists
0     1.5      1.0
1     3.0      3.0
2     1.5      2.0
3     2.5      1.5
4     1.0      3.0
5     2.5      1.5

=== 示例7: 金融数据分析示例 ===
股票数据:
  Sector Stock  Return   Volume
0   Tech  AAPL    0.05  1000000
1   Tech  MSFT   -0.02   800000
2   Tech  GOOGL   0.03  1200000
3 Finance   JPM    0.01   500000
4 Finance   BAC   -0.01   600000
5 Finance    GS    0.02   700000

按行业对收益率进行排名:
   Return  Volume
0     1.0     2.0
1     3.0     3.0
2     2.0     1.0
3     2.0     3.0
4     3.0     2.0
5     1.0     1.0

=== 示例8: 密集排名 vs 平均排名比较 ===
有多个相同分数的数据:
  Class  Score
0     A     90
1     A     90
2     A     90
3     A     85
4     A     95

平均排名 (method='average'):
   Score
0    3.0
1    3.0
2    3.0
3    1.0
4    5.0

密集排名 (method='dense'):
   Score
0    2.0
1    2.0
2    2.0
3    1.0
4    3.0

=== 示例9: 实际业务场景 - 销售排名 ===
销售数据:
    Region Salesperson    Sales   Bonus
0    North       Alice  150000   15000
1    North         Bob  180000   18000
2    North     Charlie  160000   16000
3    South       David  200000   20000
4    South         Eve  170000   17000
5    South       Frank  190000   19000
6     East       Grace  140000   14000
7     East       Henry  155000   15500
8     East         Ivy  165000   16500

按区域对销售业绩进行排名:
   Sales  Bonus
0    3.0    3.0
1    1.0    1.0
2    2.0    2.0
3    1.0    1.0
4    3.0    3.0
5    2.0    2.0
6    3.0    3.0
7    2.0    2.0
8    1.0    1.0

=== 示例10: 排名结合其他统计 ===
添加排名信息到原始数据:
    Region Salesperson    Sales   Bonus  Sales_Rank  Bonus_Rank
0    North       Alice  150000   15000           3           3
1    North         Bob  180000   18000           1           1
2    North     Charlie  160000   16000           2           2
3    South       David  200000   20000           1           1
4    South         Eve  170000   17000           3           3
5    South       Frank  190000   19000           2           2
6     East       Grace  140000   14000           3           3
7     East       Henry  155000   15500           2           2
8     East         Ivy  165000   16500           1           1
关键要点
  1. DataFrameGroupBy.rank() 方法对每个分组内的数据进行排名
  2. 排名是按分组分别计算的,不同分组之间的排名不相互影响
  3. method 参数控制相同值的排名处理方式
  4. ascending 参数控制排名顺序(升序或降序)
  5. na_option 参数控制 NaN 值的排名处理
  6. pct 参数可选择返回百分位排名
  7. 返回结果与原始 DataFrame 形状相同,便于与原始数据对齐
  8. 在绩效评估、排行榜生成、数据标准化等场景中非常有用
  9. 可以对多列同时进行分组排名
  10. 与其他 GroupBy 方法结合使用,可以实现复杂的分析需求
相关推荐
叫我:松哥18 小时前
基于scrapy的网易云音乐数据采集与分析设计实现
python·信息可视化·数据分析·beautifulsoup·numpy·pandas
测试摆渡媛1 天前
Excel模板填充工具(工具&脚本分享)
python·数据挖掘·pandas
_Soy_Milk1 天前
【算法工程师】—— Python 数据分析
python·数据分析·numpy·pandas·matplotlib
Data-Miner2 天前
类似Pandas AI的几个数据分析处理智能体介绍
人工智能·数据分析·pandas
智航GIS4 天前
11.18 自定义Pandas扩展开发指南:打造你的专属数据分析武器库
python·数据分析·pandas
人工干智能5 天前
你知道 Pandas 中 `pd.get_dummies()` 会生成哪些独热的新列么?
大数据·pandas
weixin_462446235 天前
Python 实战:将 HTML 表格一键导出为 Excel(xlsx)
linux·python·excel·pandas
2401_841495645 天前
【Python高级编程】学习通签到统计工具
python·pandas·gui·tkinter·pyinstaller·数据统计·exe程序
西红市杰出青年6 天前
Python异步----------await方法逻辑
pandas
ID_180079054737 天前
日本乐天商品详情API接口的请求构造与参数说明
开发语言·python·pandas