熊猫系列 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'的主要内容,如果未能解决你的问题,请参考以下文章