熊猫系列 sort_index() 不适用于 kind='mergesort'

Posted

技术标签:

【中文标题】熊猫系列 sort_index() 不适用于 kind=\'mergesort\'【英文标题】:pandas series sort_index() not working with kind='mergesort'熊猫系列 sort_index() 不适用于 kind='mergesort' 【发布时间】:2016-09-28 13:01:59 【问题描述】:

当我遇到这个问题时,我需要对 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.Series.sort_index 文档包含一个错误。

然而,

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

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

【问题讨论】:

【参考方案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)')

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

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

【讨论】:

是的,我知道。我需要一个适用于 DataFrames 和 Series 并且稳定的通用 sort_index。谢谢! @HNMusac,为什么要显式指定kind='mergesort'参数? 默认的'quicksort'不稳​​定!它可能会更改具有相同键的条目的原始顺序。谢谢! @HNMusac,这个系列的解决方法怎么样:s.to_frame().sort_index(kind='mergesort') 绝对有效!!但是df[cols].sort_index(kind='mergesort') 可以更好地概括例如cols = [0]cols=[0,1]。谢谢!!

以上是关于熊猫系列 sort_index() 不适用于 kind='mergesort'的主要内容,如果未能解决你的问题,请参考以下文章

熊猫读取 json 不适用于 MultiIndex

熊猫查询功能不适用于列名中的空格

如何一次从熊猫的所有列中删除逗号

为啥合并不相等匹配的行不适用于本地数据集?

CSS字体系列不适用于IE11

CSS:正文中的字体系列不适用于页面上的任何内容