Pandas 数据排序

PandasBeginner
立即练习

介绍

欢迎来到 Pandas 数据排序实验!排序是数据分析中的一项基本操作。它有助于你组织数据,使其更易于阅读、理解和分析。无论你需要查找最高值或最低值,还是仅仅按照逻辑顺序排列数据,Pandas 都提供了强大而灵活的工具来完成这项工作。

在本实验中,你将学习如何使用 Pandas 中的主要排序方法:

  • sort_values():按一个或多个列的值对 DataFrame 进行排序。
  • sort_index():按索引对 DataFrame 进行排序。
  • reset_index():在排序操作后重置索引。

在本实验结束时,你将能够熟练地根据你的分析需求来排列数据。让我们开始吧!

这是一个实验(Guided Lab),提供逐步指导来帮助你学习和实践。请仔细按照说明完成每个步骤,获得实际操作经验。根据历史数据,这是一个 初级 级别的实验,完成率为 95%。获得了学习者 100% 的好评率。

使用 sort_values 按单列对 DataFrame 进行排序

在本步骤中,你将学习最常见的排序操作:按单列的值对 DataFrame 进行排序。我们将为此使用 sort_values() 方法。by 参数用于指定你要排序的列。

首先,使用左侧的文件浏览器打开位于 ~/project 目录下的 main.py 文件。此文件已预先填充了一个示例 DataFrame。

现在,将以下代码添加到 main.py 的末尾,以按 Age 列对 DataFrame 进行排序。

## --- Step 1: Sort by a single column ---
df_sorted_by_age = df.sort_values(by='Age')
print("\nDataFrame sorted by Age:")
print(df_sorted_by_age)

你完整的 main.py 文件现在应该如下所示:

import pandas as pd

## Create a sample DataFrame for our exercises
data = {
    'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
    'Age': [25, 22, 25, 28, 22],
    'Score': [85, 91, 88, 79, 91]
}
df = pd.DataFrame(data)

print("Original DataFrame:")
print(df)

## --- Step 1: Sort by a single column ---
df_sorted_by_age = df.sort_values(by='Age')
print("\nDataFrame sorted by Age:")
print(df_sorted_by_age)

要查看结果,请从终端运行脚本。

python3 main.py

你将看到原始 DataFrame,然后是按年龄升序排序的新 DataFrame。

预期输出:

Original DataFrame:
      Name  Age  Score
0    Alice   25     85
1      Bob   22     91
2  Charlie   25     88
3    David   28     79
4      Eve   22     91

DataFrame sorted by Age:
      Name  Age  Score
1      Bob   22     91
4      Eve   22     91
0    Alice   25     85
2  Charlie   25     88
3    David   28     79

按多列升序排序

在本步骤中,你将学习如何根据多列对 DataFrame 进行排序。当你在一列排序中遇到相同值时,希望应用次要排序标准,这将非常有用。

要按多列排序,你需要将列名列表传递给 sort_values() 方法的 by 参数。Pandas 将首先按列表中的第一列进行排序,然后使用第二列来打破任何相同的排序,依此类推。

让我们先按 Age 再按 Score 对 DataFrame 进行排序。将以下代码添加到你的 main.py 文件的末尾。

## --- Step 2: Sort by multiple columns ---
df_sorted_multiple = df.sort_values(by=['Age', 'Score'])
print("\nDataFrame sorted by Age and then Score:")
print(df_sorted_multiple)

现在,再次运行脚本以查看更改。

python3 main.py

你将在输出中看到一个新部分。请注意,具有相同 Age 22 的两行现在是如何按 Score 排序的(Bob 的 91 在 Eve 的 91 之后,因为它们的顺序是稳定的)。对于具有相同 Age 25 的行也是如此。

预期输出(仅显示新部分):

...

DataFrame sorted by Age and then Score:
      Name  Age  Score
1      Bob   22     91
4      Eve   22     91
0    Alice   25     85
2  Charlie   25     88
3    David   28     79

使用 ascending=False 进行降序排序

在本步骤中,你将学习如何控制排序方向。默认情况下,sort_values() 按升序排序。你可以通过使用 ascending 参数来更改此设置。

  • 要按降序排序,请将 ascending=False 设置为 True
  • 当按多列排序时,你可以通过传递布尔值列表来为每列指定不同的顺序,例如 ascending=[True, False]

让我们按升序对 Age 进行排序,然后按降序对 Score 进行排序。这将帮助我们找到每个年龄组中得分最高的人。将以下代码添加到 main.py 的末尾。

## --- Step 3: Sort in descending and mixed order ---
df_sorted_mixed = df.sort_values(by=['Age', 'Score'], ascending=[True, False])
print("\nDataFrame sorted by Age (asc) and Score (desc):")
print(df_sorted_mixed)

运行脚本以观察结果。

python3 main.py

在输出中,查看年龄为 22 的行。Eve 和 Bob 的得分都是 91,因此它们的顺序可能不会改变。对于年龄为 25 的行,Charlie(得分 88)现在出现在 Alice(得分 85)之前,因为我们按降序对分数进行了排序。

预期输出(仅显示新部分):

...

DataFrame sorted by Age (asc) and Score (desc):
      Name  Age  Score
1      Bob   22     91
4      Eve   22     91
2  Charlie   25     88
0    Alice   25     85
3    David   28     79

使用 sort_index 对索引进行排序

在本步骤中,你将学习如何按索引对 DataFrame 进行排序。执行 sort_values() 操作后,DataFrame 的索引会变得混乱。你可以在之前的输出中看到这一点(例如,索引是 1, 4, 2, 0, 3)。

sort_index() 方法允许你根据索引标签对 DataFrame 进行排序,如果索引是简单的范围,则可以恢复原始顺序。

让我们以前一个步骤的结果(df_sorted_mixed)为例,按其索引进行排序。将以下代码添加到 main.py 的末尾。

## --- Step 4: Sort by index ---
## The previous result (df_sorted_mixed) has a jumbled index. Let's sort it by index.
df_reordered_by_index = df_sorted_mixed.sort_index()
print("\nDataFrame re-sorted by index:")
print(df_reordered_by_index)

运行脚本。

python3 main.py

你将看到 DataFrame 现在已按其索引(0, 1, 2, 3, 4)排序,这有效地将其恢复到原始行顺序。

预期输出(仅显示新部分):

...

DataFrame re-sorted by index:
      Name  Age  Score
0    Alice   25     85
1      Bob   22     91
2  Charlie   25     88
3    David   28     79
4      Eve   22     91

使用 reset_index 重置排序后的索引

在最后一步中,你将学习如何重置 DataFrame 的索引。排序后,索引不再是从 0 开始的干净的、连续的范围。虽然 sort_index() 可以恢复原始顺序,但有时你希望保留新的排序顺序,同时拥有一个全新的、连续的索引。

reset_index() 方法非常适合此目的。它会用一个默认的整数索引(0, 1, 2, ...)替换当前索引。通常使用 drop=True 参数来完全丢弃旧索引。如果你不使用 drop=True,旧索引将被添加为一个名为 index 的新列。

让我们以前面排序的 DataFrame (df_sorted_mixed) 为例,并重置其索引。将最后一段代码添加到 main.py

## --- Step 5: Reset index after sorting ---
## Let's take a sorted DataFrame and give it a new, clean index
df_with_reset_index = df_sorted_mixed.reset_index(drop=True)
print("\nSorted DataFrame with reset index:")
print(df_with_reset_index)

最后一次运行脚本。

python3 main.py

观察最终输出。DataFrame 仍然按 Age(升序)和 Score(降序)排序,但索引现在是一个从 0 到 4 的干净序列。

预期输出(仅显示新部分):

...

Sorted DataFrame with reset index:
      Name  Age  Score
0      Bob   22     91
1      Eve   22     91
2  Charlie   25     88
3    Alice   25     85
4    David   28     79

总结

恭喜你完成了 Pandas 排序数据实验!你已经掌握了在 Pandas DataFrame 中组织和排序数据的基本技能。

在此实验中,你练习了:

  • 使用 sort_values(by='column_name') 按单列排序。
  • 通过将列表传递给 by 参数来按多列排序。
  • 使用 ascending 参数控制排序方向。
  • 使用 sort_index() 通过排序索引来恢复原始顺序。
  • 使用 reset_index(drop=True) 在排序后的 DataFrame 上创建新的、干净的索引。

这些排序技术是数据清理、探索以及为更高级的分析和可视化做准备的基础。继续练习这些技能,以提高你在数据科学旅程中的效率。