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
关键要点
DataFrameGroupBy.rank()方法对每个分组内的数据进行排名- 排名是按分组分别计算的,不同分组之间的排名不相互影响
method参数控制相同值的排名处理方式ascending参数控制排名顺序(升序或降序)na_option参数控制 NaN 值的排名处理pct参数可选择返回百分位排名- 返回结果与原始 DataFrame 形状相同,便于与原始数据对齐
- 在绩效评估、排行榜生成、数据标准化等场景中非常有用
- 可以对多列同时进行分组排名
- 与其他 GroupBy 方法结合使用,可以实现复杂的分析需求