【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 方法结合使用,可以实现复杂的分析需求
相关推荐
李昊哲小课17 天前
PyArrow 完整教程
大数据·数据分析·pandas·pyarrow
云和数据.ChenGuang18 天前
T5大模型
人工智能·机器人·pandas·数据预处理·数据训练
MATLAB代码顾问19 天前
Python Pandas数据分析入门指南
python·数据分析·pandas
themingyi21 天前
Abaqus2024安装python包pandas
开发语言·python·pandas
一晌小贪欢21 天前
第26节:自动化办公——利用 Python 自动生成动态分析报告 (PPT/PDF)
开发语言·python·数据分析·自动化·powerpoint·pandas·数据可视化
留白_21 天前
pandas练习题
python·数据分析·pandas
留白_21 天前
pandas进阶学习
学习·pandas
abcy07121322 天前
python pandas csv异步后台清洗前端优先返回成功信息
前端·python·pandas
留白_23 天前
pandas文件读取与存储
开发语言·python·pandas
SilentSamsara23 天前
特征工程系统方法论:编码、分箱、交互特征与特征选择
开发语言·人工智能·python·机器学习·青少年编程·信息可视化·pandas