【问题标题】: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。

【问题讨论】:

    标签: sorting pandas indexing mergesort


    【解决方案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]。谢谢!!
    猜你喜欢
    • 1970-01-01
    • 2018-05-03
    • 1970-01-01
    • 2020-05-12
    • 1970-01-01
    • 1970-01-01
    • 2014-09-01
    • 2019-02-11
    • 2018-06-20
    相关资源
    最近更新 更多