Гарантируется ли сортировка списка уровней в фрейме данных Pandas? - PullRequest
0 голосов
/ 23 октября 2018

При создании кадра данных Pandas с MultiIndex уровни, кажется, всегда сортируются:

>>> pd.DataFrame([range(4)], columns=pd.MultiIndex.from_product([["b", "a"], [20, 10]]))
   b     a
  20 10 20 10
0  0  1  2  3

>>> _.columns
MultiIndex(levels=[[u'a', u'b'], [10, 20]],
           labels=[[1, 1, 0, 0], [1, 0, 1, 0]])

(обратите внимание, как сортируется levels.) Это гарантировано?Знание этого может помочь в написании надежного кода (поскольку тогда мы можем полагаться на простое свойство MultiIndices).

Я не могу найти никаких гарантий в документации (но это не значит, что это не моглобудь там!).

Есть также старые примеры (с 2015 года), которые показывают другое поведение, но, возможно, теперь Панды предлагают гарантии на упорядочение уровней (так же, какPython 3.6 предлагает гарантию заказа ключей в словарях)?

1 Ответ

0 голосов
/ 23 октября 2018

При создании MultiIndex с использованием уровней from_product() или from_arrays() будут отсортированы, поскольку оба метода используют _factorize_from_iterables(), который возвращает отсортированные индексы.

>> list(_factorize_from_iterables([["b", "a"], [20, 10]]))

[[array([1, 0], dtype=int8), array([1, 0], dtype=int8)],
 [Index(['a', 'b'], dtype='object'), Int64Index([10, 20], dtype='int64')]]

MultiIndex.from_tuples() также будет иметь отсортированные уровни, поскольку он использует from_arrays() для внутреннего использования.

Если вы установите MultiIndex без указания метода, уровни не будут отсортированы.

>> midx = pd.MultiIndex(levels=[['b', 'a'], [20, 10]],
                                      labels=[[0, 0, 1, 1], [0, 1, 0, 1]])
>> df = pd.DataFrame(np.random.randn(4,4), columns=midx)

>> df.columns

MultiIndex(levels=[['b', 'a'], [20, 10]],
           labels=[[0, 0, 1, 1], [0, 1, 0, 1]])

Выше используется pandas версия 0.22.0 (выпущена 29 декабря 2017 г.) и тестируется на версии 0.23.4 (последняя версия).

...