Здесь на самом деле происходит много всего, поэтому давайте разберем его.
Проблема
Существует так много разных способов создать DataFrame
(из списка records, dict, csv, ndarray, et c ...), что даже для python ветеранов может потребоваться много времени, чтобы понять их всех. Черт, в каждом из этих способов есть ДАЖЕ БОЛЬШЕ способов построить DataFrame
путем настройки некоторых параметров и еще много чего.
Например, для словарей (где значения равны длине списки), вот два способа, которыми pandas может их обработать:
Случай 1 : каждая пара ключ-значение рассматривается как заголовок столбца и его значения в каждой строке соответственно. В этом случае строки не имеют имен, поэтому по умолчанию вы можете просто назвать их по индексу строки.
Случай 2 : каждая пара ключ-значение рассматривается как Имя строки и ее значения в каждом столбце соответственно. В этом случае столбцы не имеют имен, и поэтому по умолчанию вы можете просто назвать их по индексу.
Решение
Python это слабое типизированный язык (иначе переменные не объявляют тип, а функции не объявляют возврат). В результате у него нет перегрузки функций. Итак, у вас есть две философии, когда вы хотите создать класс объекта, который может иметь несколько способов конструирования:
- Создать только один конструктор, который проверяет ввод и обрабатывает его соответствующим образом, охватывая все возможные варианты , Это может стать очень раздутым и сложным, когда определенные входные данные имеют свои собственные параметры / параметры и когда их просто слишком много.
- Разделите каждую опцию на
@classmethod
, чтобы обрабатывать каждый конкретный c индивидуальный способ Построение объекта.
Второе, как правило, лучше, так как оно действительно обеспечивает разделение проблем как принцип проектирования SE, однако пользователю необходимо знать все различные @classmethod
конструктор вызывает в результате. Хотя, по моему мнению, если ваш объектный класс достаточно сложен, чтобы иметь много различных вариантов построения, пользователь должен знать об этом в любом случае.
Путь Panda
Pandas принимает смесь сортов между двумя растворами. Он будет использовать поведение по умолчанию для каждого типа ввода, и если вы хотите получить дополнительную функциональность, вам потребуется использовать соответствующий конструктор @classmethod
.
Например, для dicts, по умолчанию, если вы передать dict в конструктор DataFrame
, он будет обрабатывать его как Case 1 . Если вы хотите выполнить второй случай, вам нужно будет использовать DataFrame.from_dict
и передать orient='index'
(без orient='index'
, будет использоваться поведение по умолчанию, описанное в base Case 1 ).
По-моему, я не фанат такого рода реализации. Лично это больше сбивает с толку, чем полезно. Честно говоря, многие pandas разработаны так. Есть причина, по которой pandas является топи c каждого другого вопроса python с тегами stackoverflow.