pandas系列sort_index()无法使用kind ='mergesort'

时间:2016-05-30 16:20:24

标签: sorting pandas indexing mergesort

当我遇到这个问题时,我需要对DataFrames进行稳定的索引排序:

如果DataFrame成为Series(当只有一列与选择匹配时),kind参数将返回错误。见例:

import pandas as pd
df_a = pd.Series(range(10))
df_b = pd.Series(range(100, 110))
df = pd.concat([df_a, df_b])
df.sort_index(kind='mergesort')

出现以下错误:

----> 6 df.sort_index(kind='mergesort')

TypeError: sort_index() got an unexpected keyword argument 'kind'

如果DataFrames(选择了多个列),则mergesort可以正常工作。

修改

从DataFrame中选择单个列时,例如:

import pandas as pd
import numpy as np
df_a = pd.DataFrame(np.array(range(25)).reshape(5,5))
df_b = pd.DataFrame(np.array(range(100, 125)).reshape(5,5))
df = pd.concat([df_a, df_b])

以下内容返回错误:

df[0].sort_index(kind='mergesort')

...因为选择被转换为pandas系列,并指出pandas.Series.sort_index文档包含错误。

然而,

df[[0]].sort_index(kind='mergesort')

工作正常,因为它的类型仍然是一个DataFrame。

1 个答案:

答案 0 :(得分:1)

pandas.Series.sort_index()没有 kind参数。

这是Pandas 0.18.1(文件:./pandas/core/series.py)的此函数的定义:

# line 1729
@Appender(generic._shared_docs['sort_index'] % _shared_doc_kwargs)
def sort_index(self, axis=0, level=None, ascending=True, inplace=False,
               sort_remaining=True):

    axis = self._get_axis_number(axis)
    index = self.index
    if level is not None:
        new_index, indexer = index.sortlevel(level, ascending=ascending,
                                             sort_remaining=sort_remaining)
    elif isinstance(index, MultiIndex):
        from pandas.core.groupby import _lexsort_indexer
        indexer = _lexsort_indexer(index.labels, orders=ascending)
        indexer = com._ensure_platform_int(indexer)
        new_index = index.take(indexer)
    else:
        new_index, indexer = index.sort_values(return_indexer=True,
                                               ascending=ascending)

    new_values = self._values.take(indexer)
    result = self._constructor(new_values, index=new_index)

    if inplace:
        self._update_inplace(result)
    else:
        return result.__finalize__(self)

档案./pandas/core/generic.py,第39行

_shared_doc_kwargs = dict(axes='keywords for axes', klass='NDFrame',
                          axes_single_arg='int or labels for object',
                          args_transpose='axes to permute (int or label for'
                          ' object)')

所以很可能这是pandas文档中的一个错误......

您的df是系列,不是数据框