跳至主要内容

Pandas 排序值:完整实用指南

使用 sort_values() 按列值重新排列行。使用 sort_index() 按 DataFrame 的索引重排行。结合两种方法,从不同角度探索数据。
· 4分钟 阅读

使用 AI 探索

在 DataFrame 中发现有趣的数据点,往往可以先调整行的顺序。如果将列名传递给 .sort_values(),就能按该列对行进行排序。

当多行具有相同的值时(在对分类变量排序时很常见),您可能希望通过另一列来“打破平局”。此时可以传递列名列表,按多列进行排序。

Pandas 按列排序示例

使用 sort_values() 按列值排序行

通过排序改变行的顺序,可以把最重要或最有意思的数据放到 DataFrame 顶部。

按单列排序

例如,对 dogs DataFrame 的 weight_kg 列应用 sort_values(),结果是最轻的狗排在顶部(吉娃娃 Stella),最重的狗在底部(圣伯纳犬 Bernie)。

dogs.sort_values("weight_kg")
      name        breed  color  height_cm  weight_kg date_of_birth
5   Stella    Chihuahua    Tan         18          2    2015-04-20
3   Cooper    Schnauzer   Gray         49         17    2011-12-11
0    Bella     Labrador  Brown         56         24    2013-07-01
1  Charlie       Poodle  Black         43         24    2016-09-16
2     Lucy    Chow Chow  Brown         46         24    2014-08-25
4      Max     Labrador  Black         59         29    2017-01-20
6   Bernie  St. Bernard  White         77         74    2018-02-27

将 ascending 参数设为 False 会反向排序,从最重到最轻。

dogs.sort_values("weight_kg", ascending=False)
      name        breed  color  height_cm  weight_kg date_of_birth
6   Bernie  St. Bernard  White         77         74    2018-02-27
4      Max     Labrador  Black         59         29    2017-01-20
0    Bella     Labrador  Brown         56         24    2013-07-01
1  Charlie       Poodle  Black         43         24    2016-09-16
2     Lucy    Chow Chow  Brown         46         24    2014-08-25
3   Cooper    Schnauzer   Gray         49         17    2011-12-11
5   Stella    Chihuahua    Tan         18          2    2015-04-20

按多列排序

通过将列名列表传给 sort_values,可以按多个变量排序。下面先按体重,再按身高排序。这样,尽管 Charlie、Lucy 和 Bella 体重相同,但它们会按从矮到高的顺序排列。

dogs.sort_values(["weight_kg", "height_cm"])
      name        breed  color  height_cm  weight_kg date_of_birth
5   Stella    Chihuahua    Tan         18          2    2015-04-20
3   Cooper    Schnauzer   Gray         49         17    2011-12-11
1  Charlie       Poodle  Black         43         24    2016-09-16
2     Lucy    Chow Chow  Brown         46         24    2014-08-25
0    Bella     Labrador  Brown         56         24    2013-07-01
4      Max     Labrador  Black         59         29    2017-01-20
6   Bernie  St. Bernard  White         77         74    2018-02-27

如需分别指定每个变量的排序方向,可向 ascending 参数传入列表。现在 Charlie、Lucy 和 Bella 会按从高到矮的顺序排列。

dogs.sort_values(["weight_kg", "height_cm"], ascending=[True, False])
      name        breed  color  height_cm  weight_kg date_of_birth
5   Stella    Chihuahua    Tan         18          2    2015-04-20
3   Cooper    Schnauzer   Gray         49         17    2011-12-11
0    Bella     Labrador  Brown         56         24    2013-07-01
2     Lucy    Chow Chow  Brown         46         24    2014-08-25
1  Charlie       Poodle  Black         43         24    2016-09-16
4      Max     Labrador  Black         59         29    2017-01-20
6   Bernie  St. Bernard  White         77         74    2018-02-27

使用 sort_index() 按行索引排序

有时,您可能希望基于行标签(即 DataFrame 的索引)而不是特定列来重新排序行。这种情况下,可以使用 sort_index() 方法替代 sort_values()。请注意,默认情况下,sort_index() 会按索引对行进行升序排序:

# Sort rows by their index (ascending)
dogs_sorted = dogs.sort_index()
print(dogs_sorted)

如果需要按降序排序行,只需传入 ascending=False:

# Sort rows by their index (descending)
dogs_sorted_desc = dogs.sort_index(ascending=False)
print(dogs_sorted_desc)

类似地,如果有多级(分层)索引,sort_index() 也可以通过对多个层级排序来处理。您只需向 level 或 ascending 参数传入列表(就像前面对 sort_values() 传入列表一样):

# Sort rows by multiple levels of a multi-level index
dogs_sorted_multi = dogs.sort_index(level=[0, 1], ascending=[True, False])
print(dogs_sorted_multi)

Pandas 排序值交互示例

在以下示例中,您将按无家可归个体人数从小到大排序 homelessness,并将结果保存为 homelessness_ind。最后,打印该排序后 DataFrame 的前几行。

# Sort homelessness by individuals
homelessness_ind = homelessness.sort_values("individuals")

# Print the top few rows
print(homelessness_ind.head())

运行上述代码后,将产生如下结果:

                region         state  individuals  family_members  state_pop
50            Mountain       Wyoming        434.0           205.0     577601
34  West North Central  North Dakota        467.0            75.0     758080
7       South Atlantic      Delaware        708.0           374.0     965479
39         New England  Rhode Island        747.0           354.0    1058287
45         New England       Vermont        780.0           511.0     624358

亲自试一试。

想进一步了解排序与子集选择,请观看我们课程 Data Manipulation with pandas 中的这段视频。

本文内容摘自 DataCamp 的 Data Manipulation with pandas 课程,作者为 Maggie Matsui 和 Richie Cotton。

延伸学习

本文讲解了何时使用 sort_index() 与 sort_values():当您希望基于列值重新排序行时,使用 sort_values();当您希望基于行标签(DataFrame 的索引)重新排序行时,使用 sort_index()。

我们还有许多实用的 pandas 教程,助您持续学习,例如 Pandas 初学者终极指南,方便您不断练习。我们也提供针对常见问题的操作指南,包括 如何将 CSV 数据导入 Pandas 和 如何在 Pandas 中连接 DataFrame。此外,别忘了学习我们的 Python 编程技能路径,不断提升您的能力。 

主题