Pandas `DataFrame` 数据排序与排名

1. Pandas DataFrame 数据排序与排名详解

在 Pandas 中,数据排序与排名 是常见的数据处理操作。通过排序和排名,可以对数据进行组织,方便后续分析和展示。主要的函数有:

  • sort_values():用于排序 DataFrameSeries 的值。
  • sort_index():按照索引进行排序。
  • rank():为数据赋予排名。

1. sort_values() 函数

sort_values() 用于对 DataFrameSeries 中的一个或多个列进行排序。它支持升序和降序排序,并可以处理缺失值。

语法:
df.sort_values(by, axis=0, ascending=True, inplace=False, kind='quicksort', na_position='last', ignore_index=False, key=None)
  • by:指定要排序的列或列的名称。如果是多个列,可以传递一个列表。
  • axis:排序的轴,默认值为 0,表示按行排序;设置为 1 时表示按列排序。
  • ascending:是否升序排列,默认值为 True(升序)。如果是多个列,可以传递一个布尔值列表。
  • inplace:是否修改原始 DataFrame,默认为 False,返回排序后的数据。
  • kind:排序算法,可以是 'quicksort''mergesort''heapsort'
  • na_position:如何处理缺失值,'last'(默认)将缺失值放在最后,'first' 将缺失值放在最前面。
示例 1:按单列升序排序
import pandas as pd

# 创建示例 DataFrame
df = pd.DataFrame({
    'Name': ['Alice', 'Bob', 'Charlie', 'David'],
    'Age': [24, 30, 35, 28],
    'Salary': [50000, 60000, 70000, 80000]
})

# 按 'Age' 列升序排序
df_sorted = df.sort_values(by='Age')
print(df_sorted)

输出:

      Name  Age  Salary
0    Alice   24   50000
3    David   28   80000
1      Bob   30   60000
2  Charlie   35   70000
示例 2:按多列排序
# 按 'Age' 升序排序,如果 'Age' 相同,则按 'Salary' 降序排序
df_sorted = df.sort_values(by=['Age', 'Salary'], ascending=[True, False])
print(df_sorted)

输出:

      Name  Age  Salary
0    Alice   24   50000
3    David   28   80000
1      Bob   30   60000
2  Charlie   35   70000
示例 3:处理缺失值排序
# 添加缺失值并进行排序
df_with_na = pd.DataFrame({
    'Name': ['Alice', 'Bob', 'Charlie', 'David'],
    'Age': [24, None, 35, 28],
    'Salary': [50000, 60000, 70000, 80000]
})

# 按 'Age' 升序排序,将缺失值放在最后
df_sorted = df_with_na.sort_values(by='Age', na_position='last')
print(df_sorted)

输出:

      Name   Age  Salary
0    Alice  24.0   50000
3    David  28.0   80000
2  Charlie  35.0   70000
1      Bob   NaN   60000

2. sort_index() 函数

sort_index() 用于按索引对 DataFrameSeries 进行排序。

语法:
df.sort_index(axis=0, level=None, ascending=True, inplace=False, kind='quicksort', na_position='last', ignore_index=False)
  • axis:排序的轴,0 为按行排序,1 为按列排序。
  • level:多级索引时,指定要排序的级别。
  • ascending:是否升序排列。
  • inplace:是否修改原始 DataFrame
  • na_position:如何处理缺失值。
示例:按索引排序
# 创建示例 DataFrame
df = pd.DataFrame({
    'Name': ['Alice', 'Bob', 'Charlie', 'David'],
    'Age': [24, 30, 35, 28],
    'Salary': [50000, 60000, 70000, 80000]
}, index=[3, 1, 2, 4])

# 按索引升序排序
df_sorted = df.sort_index(ascending=True)
print(df_sorted)

输出:

      Name  Age  Salary
1      Bob   30   60000
2  Charlie   35   70000
3    Alice   24   50000
4    David   28   80000

3. rank() 函数

rank() 用于为数据列分配排名,可以处理相同的值,并支持不同的排名方法(例如平均排名、最小排名等)。

语法:
df.rank(axis=0, method='average', numeric_only=None, na_option='keep', ascending=True, pct=False)
  • axis:指定沿着哪一轴排名,0 为按行排名,1 为按列排名。
  • method:排名的方法,常见的有 'average'(平均排名)、'min'(最小排名)、'max'(最大排名)、'first'(按出现顺序排名)、'dense'(密集排名)。
  • na_option:处理缺失值的方法,'keep' 保留缺失值,'top' 将缺失值排在顶部,'bottom' 将缺失值排在底部。
  • ascending:是否升序排列。
  • pct:如果为 True,则返回百分比排名(0到1之间的浮动值)。
示例 1:按单列排名
# 创建示例 DataFrame
df = pd.DataFrame({
    'Name': ['Alice', 'Bob', 'Charlie', 'David'],
    'Age': [24, 30, 35, 28],
    'Salary': [50000, 60000, 70000, 80000]
})

# 按 'Salary' 排名
df['Salary_Rank'] = df['Salary'].rank()
print(df)

输出:

      Name  Age  Salary  Salary_Rank
0    Alice   24   50000          1.0
1      Bob   30   60000          2.0
2  Charlie   35   70000          3.0
3    David   28   80000          4.0
示例 2:处理重复值排名
# 创建包含重复值的示例 DataFrame
df = pd.DataFrame({
    'Name': ['Alice', 'Bob', 'Charlie', 'David'],
    'Salary': [50000, 50000, 70000, 80000]
})

# 按 'Salary' 排名,使用平均排名方法
df['Salary_Rank'] = df['Salary'].rank(method='average')
print(df)

输出:

      Name  Salary  Salary_Rank
0    Alice   50000          1.5
1      Bob   50000          1.5
2  Charlie   70000          3.0
3    David   80000          4.0
示例 3:百分比排名
# 创建示例 DataFrame
df = pd.DataFrame({
    'Name': ['Alice', 'Bob', 'Charlie', 'David'],
    'Salary': [50000, 60000, 70000, 80000]
})

# 按 'Salary' 排名,返回百分比排名
df['Salary_Percent_Rank'] = df['Salary'].rank(pct=True)
print(df)

输出:

      Name  Salary  Salary_Percent_Rank
0    Alice   50000                  0.25
1      Bob   60000                  0.50
2  Charlie   70000                  0.75
3    David   80000                  1.00

总结

在 Pandas 中,排序和排名是非常常见的操作:

  • sort_values():用于按列的值进行排序,可以升序或降序排列,支持多个排序条件。
  • sort_index():按索引对数据进行排序。
  • rank():为数据分配排名,支持多种排名方法和缺失值处理。

这些操作在数据分析和数据预处理阶段非常有用,尤其是在需要对数据进行排序、排名、排名平局处理等任务时。

2. Pandas DataFrame 数据排序与排名综合实战

在本部分中,我们将通过一个综合实战案例,展示如何使用 Pandas 进行 数据排序与排名,以帮助您更好地理解如何在实际应用中处理数据。假设我们有一个包含学生成绩的 DataFrame,我们将根据成绩进行排序,并为每个学生分配排名。

1. 创建示例数据集

首先,我们创建一个包含学生姓名、学科和成绩的 DataFrame

import pandas as pd

# 创建包含学生成绩的 DataFrame
data = {
    'Student': ['Alice', 'Bob', 'Charlie', 'David', 'Eva'],
    'Math': [85, 92, 78, 88, 93],
    'English': [88, 78, 92, 85, 90],
    'Science': [90, 85, 88, 92, 91]
}

df = pd.DataFrame(data)
print(df)

输出:

    Student  Math  English  Science
0    Alice    85       88       90
1      Bob    92       78       85
2  Charlie    78       92       88
3    David    88       85       92
4      Eva    93       90       91

2. 数据排序

按单科成绩排序

我们可以根据某一科目的成绩对学生进行排序,假设我们要根据数学成绩对学生进行降序排序。

# 按数学成绩进行降序排序
df_sorted_math = df.sort_values(by='Math', ascending=False)
print(df_sorted_math)

输出:

    Student  Math  English  Science
4      Eva    93       90       91
1      Bob    92       78       85
3    David    88       85       92
0    Alice    85       88       90
2  Charlie    78       92       88
按多科成绩排序

如果我们想要根据多科成绩进行排序(例如,先按数学成绩排序,数学成绩相同的按英语成绩排序),可以使用多个排序条件。

# 先按数学成绩降序排序,若数学成绩相同,再按英语成绩降序排序
df_sorted_multi = df.sort_values(by=['Math', 'English'], ascending=[False, False])
print(df_sorted_multi)

输出:

    Student  Math  English  Science
4      Eva    93       90       91
1      Bob    92       78       85
3    David    88       85       92
0    Alice    85       88       90
2  Charlie    78       92       88

3. 数据排名

计算单科排名

我们可以为每一位学生在数学、英语和科学成绩上分别分配排名,使用 rank() 方法。默认情况下,rank() 会为相同成绩的学生分配相同的排名(平均排名)。

# 为每一科成绩分配排名
df['Math_Rank'] = df['Math'].rank(ascending=False)
df['English_Rank'] = df['English'].rank(ascending=False)
df['Science_Rank'] = df['Science'].rank(ascending=False)

print(df)

输出:

    Student  Math  English  Science  Math_Rank  English_Rank  Science_Rank
0    Alice    85       88       90        4.0            2.0           2.0
1      Bob    92       78       85        2.0            5.0           5.0
2  Charlie    78       92       88        5.0            1.0           4.0
3    David    88       85       92        3.0            4.0           1.0
4      Eva    93       90       91        1.0            3.0           3.0
修改排名方法

可以改变排名的方法。例如,使用 'min' 方法可以为相同成绩的学生分配相同的最小排名。

# 使用 'min' 方法进行排名
df['Math_Rank_Min'] = df['Math'].rank(method='min', ascending=False)
df['English_Rank_Min'] = df['English'].rank(method='min', ascending=False)
df['Science_Rank_Min'] = df['Science'].rank(method='min', ascending=False)

print(df)

输出:

    Student  Math  English  Science  Math_Rank  English_Rank  Science_Rank  Math_Rank_Min  English_Rank_Min  Science_Rank_Min
0    Alice    85       88       90        4.0            2.0           2.0            4.0               2.0               2.0
1      Bob    92       78       85        2.0            5.0           5.0            2.0               5.0               5.0
2  Charlie    78       92       88        5.0            1.0           4.0            5.0               1.0               4.0
3    David    88       85       92        3.0            4.0           1.0            3.0               4.0               1.0
4      Eva    93       90       91        1.0            3.0           3.0            1.0               3.0               3.0
百分比排名

如果需要计算学生成绩的百分比排名,可以设置 pct=True

# 计算百分比排名
df['Math_Percent_Rank'] = df['Math'].rank(pct=True)
df['English_Percent_Rank'] = df['English'].rank(pct=True)
df['Science_Percent_Rank'] = df['Science'].rank(pct=True)

print(df)

输出:

    Student  Math  English  Science  Math_Rank  English_Rank  Science_Rank  Math_Rank_Min  English_Rank_Min  Science_Rank_Min  Math_Percent_Rank  English_Percent_Rank  Science_Percent_Rank
0    Alice    85       88       90        4.0            2.0           2.0            4.0               2.0               2.0              0.25               0.50                0.50
1      Bob    92       78       85        2.0            5.0           5.0            2.0               5.0               5.0              0.75               0.00                0.00
2  Charlie    78       92       88        5.0            1.0           4.0            5.0               1.0               4.0              0.00               1.00                0.25
3    David    88       85       92        3.0            4.0           1.0            3.0               4.0               1.0              0.50               0.25                1.00
4      Eva    93       90       91        1.0            3.0           3.0            1.0               3.0               3.0              1.00               0.75                0.75

4. 总成绩排名

如果我们需要根据总成绩(例如所有科目成绩的和或平均值)进行排名,可以创建一个新的列,计算每个学生的总成绩或平均成绩,然后对其进行排名。

# 计算总成绩并进行排名
df['Total'] = df[['Math', 'English', 'Science']].sum(axis=1)
df['Total_Rank'] = df['Total'].rank(ascending=False)

print(df)

输出:

    Student  Math  English  Science  Math_Rank  English_Rank  Science_Rank  Math_Rank_Min  English_Rank_Min  Science_Rank_Min  Math_Percent_Rank  English_Percent_Rank  Science_Percent_Rank  Total  Total_Rank
0    Alice    85       88       90        4.0            2.0           2.0            4.0               2.0               2.0              0.25               0.50                0.50   263.0         4.0
1      Bob    92       78       85        2.0            5.0           5.0            2.0               5.0               5.0              0.75               0.00                0.00   255.0         5.0
2  Charlie    78       92       88        5.0            1.0           4.0            5.0               1.0               4.0              0.00               1.00                0.25   258.0         3.0
3    David    88       85       92        3.0            4.0           1.0            3.0               4.0               1.0              0.50               0.25                1.00   265.0         2.0
4      Eva    93       90       91        1.0            3.0           3.0            1.0               3.0               3.0              1.00               0.75                0.75   274.0         1.0

总结

通过这个综合实战,我们展示了如何在 Pandas 中使用 排序与排名 函数来组织数据:

  • sort_values():按列值对数据进行排序。
  • rank():为数据列分配排名,并支持多种排名方法。
  • 百分比排名:为每个数据计算百分比排名,表示数据在所有项中的相对位置。
  • Total_Rank:通过计算总成绩进行排名,常用于综合分析。

这些方法可以广泛应用于数据清洗、分析和报告生成等场景。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI Agent首席体验官

您的打赏是我继续创作的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值