为什么在Pandas Series上调用.sort()函数会原地排序并且返回None?

11 投票
4 回答
25479 浏览
提问于 2025-04-18 08:39

抱歉,我觉得我在这里漏掉了一些非常基础的东西:

>>> Series([3,4,0,3]).sort()

这个输出是None,而

>>> Series([3,4,0,3]).order()
2    0
0    3
3    3
1    4
dtype: int64

我在使用sort()的时候到底漏掉了什么呢?

谢谢

补充:

感谢大家的回答,我现在明白这是就地排序。但我不明白为什么

>>> s = Series([3,4,0,3]).sort()
>>> s

不会返回排序后的Series。如果我理解手册的话,它应该返回排序好的Series。

4 个回答

0

和大多数其他的Python可迭代对象一样,Series.sort()这个方法实际上不返回任何东西,而是直接在原地对Series进行排序。举个例子,看看如何排序一个Python列表:

In [2]: foo = [5, 3, 9]

In [3]: foo.sort()

In [4]: foo
Out[4]: [3, 5, 9]
4

.sort()order() 这两个函数已经不再推荐使用了。

现在应该用 .sort_values() 函数来替代,下面是如何使用它的例子。

例子:

import numpy as np
import pandas as pd

arr = np.array([1,3,4,2])
series = pd.Series(arr)

升序排列
这个和旧版本中的 .order() 函数是一样的。

ascending = series.sort_values() 


降序排列
这个和 .order(ascending=False) 是一样的。

descending = series.sort_values(ascending=False)


原地排序
这个和旧版本中的 .sort() 函数是一样的。

series.sort_values(inplace=True) 

想了解更多信息,可以查看官方文档

4
In [1]: import pandas as pd
In [2]: s = pd.Series([3,4,0,3]).sort()
In [3]: s

确实,In [3] 不会输出任何内容,你可以检查一下:

In [4]: type(s)
Out[4]: NoneType

原因是:

pd.Series([3,4,0,3]) 确实会返回一个 pandas 的 Series 类型对象,但 Series.sort() 方法不会返回任何东西,这是因为它是 就地排序。所以表达式 s = pd.Series([3,4,0,3]).sort() 中,左边的 s 从右边没有得到任何值,因此 In [3]: s 不会输出任何内容。

注意:

0.17.0 版本之后,按排序的方法 pandas.Series.sort()pandas.Series.order() 已经被弃用,取而代之的是一个统一的pandas.Series.sort_values() API。想了解更多细节,可以查看 这个回答

4

.sort() 是一种就地排序的方法。

这意味着,当你调用 .sort() 后,你原来的数组就已经被排序好了。它不会返回任何东西。

举个“核心”Python的例子:

In [175]: L = [2, 3, 1, 5]

In [176]: L.sort()

In [177]: print(L)
[1, 2, 3, 5]

Pandas 也是这样,具体可以参考 Pandas.sort 的文档:

按值对数值和索引标签进行排序,直接在原地进行。为了与 ndarray API 兼容。没有返回值。

另见:Series.sort() 和 Series.order() 有什么区别?

撰写回答