Pandas 排序方法2025年3月17日 | 阅读 12 分钟 Pandas 排序方法是通过 Python 进行数据分析基础学习和实践的最主要方式。数据分析通常使用 Pandas、SQL 和电子表格进行。 Pandas 可以处理大量数据,并提供高性能的数据操作功能。 本教程将解释如何使用 .sort_values() 和 .sort_index(),它们使用户能够高效地在 DataFrame 中对数据进行排序。 引言DataFrame 是一种具有已标记轴(行和列)的数据结构。用户可以按行或列的值,或者按行或列的索引对 DataFrame 进行排序。 行和列都有数值表示,用于指示数据在用户 DataFrame 中的位置,称为索引。因此,用户可以通过 DataFrame 的索引位置从特定行或列检索数据。默认情况下,索引号从零开始,但用户可以手动分配自己的索引。 准备数据集在本教程中,我们将使用美国环境保护署 (EPA) 编译的关于 1984 年至 2021 年制造的车辆的 燃油经济性数据集。美国环境保护署的数据集非常适合理解排序,因为它包含从数字到文本数据的各种信息类型,用户可以基于这些信息进行排序。此数据集总共包含八十三列。 在开始分析和排序数据集之前,用户需要安装 Pandas 库。 Pandas 库的版本应为 1.2.0,Python 的版本应高于 3.7.1。 为了进行分析,用户将查看车辆按型号、年份、制造商和其他属性的每加仑英里数 (MPG) 数据。用户可以指定在 DataFrame 中包含哪些列。对于本文,我们将只需要一部分可访问列。 在接下来的示例中,我们已传递命令将燃油经济性数据集的重要列读入 DataFrame,它还将显示新 DataFrame 的前五行。 例如 输出 ![]() 用户可以通过调用 .read_csv() 函数并提供数据集 URL 来将数据集加载到 DataFrame 中。为了获得更快的输出和较低的内存使用,我们已缩小了列的范围。为了进一步限制内存消耗并快速预览数据,用户还可以使用 'nrows' 命令指定他们想要加载的行数。 sort_values() 函数用户可以使用 sort_values() 函数沿两个轴(行或列)对 DataFrame 中的值进行排序。如果他们想根据一个或多个列的值对 DataFrame 中的行进行排序。 ![]() 上图是使用 sort_values() 函数基于 highway08 列的值对 DataFrame 行进行排序的结果。这是我们使用列在电子表格中排序数据的示例。 sort_index() 函数用户还可以使用 sort_index() 函数按其行索引或列标签对 DataFrame 进行排序。 sort_values() 和 sort_index() 之间的区别在于 sort_values() 基于行或列中的值对 DataFrame 进行排序,而在 .sort_index() 中,我们基于索引或列标签对 DataFrame 进行排序。 ![]() DataFrame 的索引不被视为一列,而且可能只有一个原始索引。 DataFrame 的行索引可以看作是行号,最有可能从零开始。 按单列对 DataFrame 进行排序为了根据单列的值对 DataFrame 进行排序,我们将使用 sort_values()。默认情况下,它将返回一个新的已排序的 DataFrame,按升序排序。但它不会更改原始 DataFrame。 按升序对列进行排序为了使用 .sort_values(),我们将向该方法传递一个包含我们要排序的列名的单个参数。在下一个示例中,我们将按 city08 列对 DataFrame 进行排序。这表示仅燃油汽车的城市每加仑英里数。 例如 输出 ![]() 默认情况下,它会使用标记为“city08”的列的值按升序对 DataFrame 进行排序。但是,我们没有为传递给 .sort_values() 的参数指定名称,我们实际上使用了 by 参数,我们将在下一个示例中解释。 更改排序顺序默认情况下,sort_values() 按升序对 DataFrame 进行排序,但如果我们想按降序对 DataFrame 进行排序,我们可以将 False 值传递给该参数。 例如 输出 ![]() 我们通过将 False 值传递给 ascending 来反转排序顺序。现在我们已按城市条件测量的平均每加仑英里数按降序对 DataFrame 进行了排序。在上一个输出中,我们的 DataFrame 中的车辆按 MPG 值最高排列在前几行。 选择排序算法Pandas 允许用户在 .sort_values() 和 .sort_index() 的多种排序算法中进行选择。排序算法如下:
默认情况下,quicksort 算法用于对单列进行排序。要更改为稳定的排序算法,我们可以使用 mergesort 算法。我们可以通过在 sort_values() 或 sort_index() 中使用 kind 参数来实现。我们还可以使用 heapsort 算法对数据进行排序,但 heapsort 仅推荐用于最坏情况,因为它是最慢的排序算法且不稳定。 例如 输出 ![]() 通过使用 kind 参数,我们将 mergesort 算法设置为排序算法。之前的输出默认使用了 quicksort 算法。我们可以注意到,这两种算法的输出不同,因为 quicksort 算法不是一种稳定的排序算法。 请始终记住,在 pandas 中,当我们按多个列标签排序时,我们会忽略 kind 参数。 当我们对多个具有相同键的记录进行排序时,稳定的排序算法可以在排序后保持这些记录的原始顺序。我们需要使用稳定的排序算法的原因是我们正在执行多次排序。 按多个列对 DataFrame 进行排序在数据分析过程中,我们有时希望按多个列的值对数据进行排序。假设我们有一个包含人们姓名的姓氏和名字的数据集。我们希望先按名字再按姓氏对它进行排序。这样,名字相同的人就可以按姓氏按字母顺序排列。 在以下示例中,我们将按名为 city08 的单列对 DataFrame 进行排序。城市条件下的 MPG 是决定汽车吸引力的重要因素。假设我们还想查看高速公路条件下的每加仑英里数,除了城市条件下的 MPG。为了按两个键对 DataFrame 进行排序,我们可以通过 by 参数传递列标签列表。 例如 输出 ![]() 在这里,通过指定 city08 和 highway08 列标签列表,我们使用 sort_values() 对这两列进行了排序。 在下一个示例中,我们将解释如何指定排序顺序以及为什么用户要注意他们使用的列标签列表很重要。 按多列升序排序为了按多列对 DataFrame 进行排序,我们必须提供一个列标签列表。假设,为了按 make 和 model 对 DataFrame 进行排序。我们应该创建以下列表,然后将其传递给 sort_values()。 例如 输出 ![]() 现在,我们的 DataFrame 按 make 列升序排序。如果有两个或更多相同的 make,则 DataFrame 将按 model 列排序。 DataFrame 将根据我们在列表中指定的列标签顺序进行排序。 更改列的排序顺序由于我们正在按多列对 DataFrame 进行排序,我们也可以指定我们希望按何种顺序对列进行排序。如果我们要更改最后一个示例中 DataFrame 的排序顺序,那么我们可以更改传递给 by 参数的列表中列标签的顺序。 例如 输出 ![]() 现在,我们的 DataFrame 按 model 列升序排序,如果存在两个或更多相同的 model,则 DataFrame 将按 make 列排序。我们可以注意到,当我们更改列的顺序时,值的排序顺序也会改变。 按多列降序排序到目前为止,我们已按升序对多列进行了排序。在以下示例中,我们将按降序对多列进行排序。为了按降序对 DataFrame 进行排序,我们将 ascending 值设置为 False。 例如 输出 ![]() 在这里,我们可以注意到,在 DataFrame 中,make 列按反字母顺序排序,对于任何具有相同 make 的汽车,model 列的值按降序排序。对于文本数据,排序是一个敏感情况,这意味着大写文本在升序中首先出现,在降序中最后出现。 按具有不同排序顺序的多列进行排序使用 Python 中的 Pandas,我们可以按多列进行排序,并使用不同的升序参数,并且可以在一次函数调用中完成。如果用户希望某些列按升序排序,而另一些列按降序排序,那么他们必须将布尔值列表传递给 ascending。 在下面的示例中,我们将按 make、model 和 city08 列对 DataFrame 进行排序,前两列应按升序排序,city08 列应按降序排序。为此,我们将通过 by 参数传递列标签列表,并将布尔值列表传递给 ascending。 例如 s输出 ![]() 现在,我们的 DataFrame 按 make 和 model 列升序排序,city08 列按升序排序。这很有用,因为通过这种方式,汽车组按类别顺序排列,并显示 MPG 最高的第一批汽车。 按索引对 DataFrame 进行排序在开始排序索引之前,让我们先了解一下索引的含义。DataFrame 有一个 .index 属性,默认情况下它是行位置的数值表示。索引就像行号。索引有助于快速查找和识别行。 按升序索引排序我们可以使用 sort_index() 函数按行索引对 DataFrame 进行排序。按列值排序(如我们在前面的示例中所做的那样)会重新排序 DataFrame 中的行,因此索引会变得混乱。当用户筛选 DataFrame 或添加/删除行时,也可能发生这种情况。 为了说明 .sort_index() 的用法,让我们先通过使用 .sort_values() 函数创建一个新的已排序 DataFrame。 示例 输出 ![]() 在这里,我们创建了一个已排序的 DataFrame。我们还可以注意到行索引没有按任何特定顺序排列。为了让我们的新 DataFrame 恢复到原始顺序,我们可以使用 sort_index() 函数。 示例 输出 ![]() 现在,我们的 DataFrame 的索引是按升序排列的。在 sort_index() 中,就像在 sort_values() 中一样,升序的默认参数为 True。通过传递 False 值,我们可以将其更改为降序。按索引排序不会对数据产生任何影响,因为值未更改。 对于希望使用 sort_index() 分配自定义索引的用户来说,这很有用。假设我们想使用 make 和 model 列设置自定义索引,那么我们必须将列表传递给 set_index()。 示例 输出 ![]() 通过使用此方法,我们可以用两个轴标签替换默认的基于整数的行索引。这被认为是分层索引或多级索引。 DataFrame 现在由多个键索引,可以使用 .sort_index() 进行排序。 示例 输出 ![]() 首先,我们使用 make 和 model 列为 DataFrame 分配了一个新索引,然后我们使用 .sort_index() 函数对索引进行了排序。 按降序索引排序现在,我们将按降序对其索引对 DataFrame 进行排序。为了获得降序输出,我们必须将 ascending 的值设置为 False,这与我们在 .sort_values() 中所做的相同。 示例 输出 ![]() 现在,我们的 DataFrame 已按降序索引排序。 .sort_index() 和 .sort_values() 之间有一个区别,那就是 sort_index() 没有参数,因为它默认按行索引对 DataFrame 进行排序。 探索高级索引排序概念在数据分析过程中,当用户想要对分层索引进行排序时,会出现许多情况。我们已经看到如何为 MultiIndex 使用 make 和 model 列。对于此数据集,我们还可以将 id 列用作索引。 让我们将 id 列设置为索引,这将有助于链接相关数据集。例如,EPA 的排放数据集也使用 id 来表示车辆记录 ID。它将排放数据集链接到燃油经济性数据集。现在,通过对两个数据集的索引进行排序,可以使用 merge()、join() 和 concat() 等其他函数来加快速度。 对 DataFrame 的列进行排序我们还可以使用 DataFrame 的列标签对行值进行排序。通过将 sort_index() 中的可选参数 axis 设置为 1,我们可以按列标签对 DataFrame 进行排序。排序算法应用于轴标签而不是实际数据。这将有助于对 DataFrame 进行可视化审查。 如何处理 DataFrame 轴当用户使用 .sort_index() 且不传递任何显式参数时。默认情况下,它使用 axis = 0 参数。DataFrame 的轴是指索引(axis = 0)和列(axis = 1)。用户可以使用这两个轴来选择和索引 DataFrame 中的数据,还可以对数据进行排序。 使用列标签进行排序我们还可以使用列标签作为 DataFrame 的排序键来进行 sort_index 函数。 让我们将 axis 设置为 1,以便按列名对 DataFrame 的列进行排序。 示例 输出 ![]() DataFrame 的列按升序字母顺序从左到右排序。现在,假设我们要按降序对列进行排序,那么我们只需将 ascending 值设置为 False 即可。 示例 输出 ![]() 通过在 .sort_index() 函数中使用 axis = 1,我们已按升序和降序对 DataFrame 的列进行了排序。这在其他数据集中可能更有用,这些数据集中的列标签对应于一年中的月份。在这种情况下,按月份升序或降序排列数据是有意义的。 结论在本文中,我们讨论了如何使用 sort_values() 和 sort_index() 高效地对 DataFrame 中的数据进行排序。如何按一个或多个列的值对 pandas DataFrame 进行排序,并使用 ascending 参数更改排序顺序,以及如何使用 .sort_index() 函数按索引对 DataFrame 进行排序。 下一主题Pandas 中删除列 |
我们请求您订阅我们的新闻通讯以获取最新更新。