Что делает pd.Series.cat.as_ordered() в Pandas?

#python #pandas

#python #pandas

Вопрос:

Я просматривал часть исходного кода в библиотеке fastai, и функция train_cats читается следующим образом:

 def train_cats(df):
    """
    Change any columns of strings in a panda's dataframe to a column 
    of catagorical values. This applies the changes inplace.
    """

    for n,c in df.items():
        if is_string_dtype(c): df[n] = c.astype('category').cat.as_ordered()
  

Я понимаю, что делает функция, но я не был уверен, чего должна была достичь as_ordered часть.

Я попытался просмотреть документацию по нему, и она была скудной. К моему удивлению, в as_ordered() Интернете тоже не так много информации.

В чем основное преимущество добавления этого метода в данных обстоятельствах?

Спасибо.

Ответ №1:

Вам следует взглянуть на раздел «Сортировка и порядок» по этой ссылке: Документация Pandas по Categorical. В нем говорится, что:

Если категориальные данные упорядочены (s.cat.ordered == True), то порядок категорий имеет значение и возможны определенные операции. Если категориальный параметр неупорядочен, .min() /.max() вызовет ошибку типа.

И:

Вы можете упорядочить категориальные данные с помощью as_ordered() или неупорядочить с помощью as_unordered(). Они по умолчанию вернут новый объект.

Комментарии:

1. По сути, это означает, что каждый столбец, который преобразуется в категорию, будет иметь предполагаемый порядок и соответствующие min (), max () и т.д.?

2. ДА. Вот и все!

Ответ №2:

Мы можем получить некоторую информацию из pandas.Categorical

 s=pd.Series(list('zbdce')).astype('category')
s
0    z
1    b
2    d
3    c
4    e
dtype: category
Categories (5, object): [b, c, d, e, z]
s.cat.as_ordered()
0    z
1    b
2    d
3    c
4    e
dtype: category
Categories (5, object): [b < c < d < e < z]
  

 pd.Categorical(list('zbdce'))
[z, b, d, c, e]
Categories (5, object): [b, c, d, e, z]
pd.Categorical(list('zbdce'),ordered=True)
[z, b, d, c, e]
Categories (5, object): [b < c < d < e < z]
  

упорядоченный : логическое значение (по умолчанию False) Является ли эта категория
обрабатывается как упорядоченная категория. Если True, результирующий категориальный
будет упорядочен. Упорядоченная категория учитывает, что при сортировке
порядок его атрибута categories (который, в свою очередь, является категориями
аргумент, если указан).

Ответ №3:

Это вспомогательная функция, которая вызывается set_ordered с первым аргументом, установленным в True .

Вот set_ordered :

     def set_ordered(self, value, inplace=False):
    """
    Set the ordered attribute to the boolean value.
    Parameters
    ----------
    value : bool
       Set whether this categorical is ordered (True) or not (False).
    inplace : bool, default False
       Whether or not to set the ordered attribute in-place or return
       a copy of this categorical with ordered set to the value.
    """
        inplace = validate_bool_kwarg(inplace, 'inplace')
        new_dtype = CategoricalDtype(self.categories, ordered=value)
        cat = self if inplace else self.copy()
        cat._dtype = new_dtype
        if not inplace:
            return cat
  

Таким образом, это просто устанавливает тот факт, что вы хотите рассматривать свои категориальные данные как имеющие порядок. Здесь есть еще несколько скудных документов:https://pandas.pydata.org/pandas-docs/version/0.23/generated/pandas.api.types.CategoricalDtype.ordered.html

Некоторое обсуждение можно найти здесь: https://github.com/pandas-dev/pandas/issues/14711