2016-05-30 4 views
1

я нуждался в сортировке стабильный индекс для DataFrames, когда у меня была эта проблема:панды серии sort_index() не работает с любезного = «слиянием»

В тех случаях, когда DataFrame превращается в череду (когда только один матчи столбцов выбор), аргумент вида возвращает ошибку. Смотрите пример:

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 (более выбран один столбец), работает нормально слияние.

РЕДАКТИРОВАТЬ:

При выборе одного столбца из 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.

ответ

0

pandas.Series.sort_index() имеет nokind параметр.

здесь является определение этой функции для панды 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 - это серия, это не данные fr ame

+0

да, я знаю. Мне нужен общий sort_index, который работал как для DataFrames, так и для Series, и это было стабильно. Благодаря! –

+0

@HNMusac, почему вы хотите явно указать параметр 'kind = 'mergesort''? – MaxU

+0

По умолчанию «quicksort» нестабильна! Он может изменить первоначальный порядок записей с одним и тем же ключом. Благодаря! –