为什么在Pandas Series上调用.sort()函数会原地排序并且返回None?
抱歉,我觉得我在这里漏掉了一些非常基础的东西:
>>> 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 个回答
和大多数其他的Python可迭代对象一样,Series.sort()这个方法实际上不返回任何东西,而是直接在原地对Series进行排序。举个例子,看看如何排序一个Python列表:
In [2]: foo = [5, 3, 9]
In [3]: foo.sort()
In [4]: foo
Out[4]: [3, 5, 9]
.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)
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。想了解更多细节,可以查看 这个回答。
.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 兼容。没有返回值。