Версия 0.7.0 (9 февраля 2012)#
Новые возможности#
Новый унифицированный функцию merge для эффективного выполнения полного набора операций базы данных / реляционной алгебры. Рефакторинг существующих методов соединения для использования новой инфраструктуры привел к значительному повышению производительности (GH 220, GH 249, GH 267)
Новый унифицированная функция конкатенации для объединения объектов Series, DataFrame или Panel вдоль оси. Может формировать объединение или пересечение других осей. Улучшает производительность
Series.appendиDataFrame.append(GH 468, GH 479, GH 273)Можно передать несколько DataFrame в
DataFrame.appendдля объединения (стэкинга) и нескольких Series дляSeries.appendтожеМожет передать список словарей (например, список объектов JSON) в конструктор DataFrame (GH 526)
Теперь вы можете установить несколько столбцов в DataFrame через
__getitem__, полезно для преобразования (GH 342)Обрабатывать выходные значения с разными индексами в
DataFrame.apply(GH 498)
In [1]: df = pd.DataFrame(np.random.randn(10, 4))
In [2]: df.apply(lambda x: x.describe())
Out[2]:
0 1 2 3
count 10.000000 10.000000 10.000000 10.000000
mean 0.190912 -0.395125 -0.731920 -0.403130
std 0.730951 0.813266 1.112016 0.961912
min -0.861849 -2.104569 -1.776904 -1.469388
25% -0.411391 -0.698728 -1.501401 -1.076610
50% 0.380863 -0.228039 -1.191943 -1.004091
75% 0.658444 0.057974 -0.034326 0.461706
max 1.212112 0.577046 1.643563 1.071804
[8 rows x 4 columns]
Добавить
reorder_levelsметод для Series и DataFrame (GH 534)Добавить словареподобный
getфункцию в DataFrame и Panel (GH 521)Добавить
DataFrame.iterrowsметод для эффективного перебора строк DataFrameДобавить
DataFrame.to_panelс кодом, адаптированным изLongPanel.to_longДобавить
reindex_axisметод добавлен в DataFrameДобавить
levelопция для бинарных арифметических функций наDataFrameиSeriesДобавить
levelопция дляreindexиalignметоды Series и DataFrame для трансляции значений по уровню (GH 542, GH 552, другие)Добавить доступ к элементам по атрибутам в
Panelи добавить автодополнение IPython (GH 563)Добавить
logyопция дляSeries.plotдля логарифмического масштабирования на оси YДобавить
indexиheaderопции дляDataFrame.to_stringМожет передавать несколько DataFrame в
DataFrame.joinдля соединения по индексу (GH 115)Добавлен
justifyаргумент дляDataFrame.to_stringдля разрешения различного выравнивания заголовков столбцовДобавить
sortопция для GroupBy, позволяющая отключить сортировку ключей групп для потенциального ускорения (GH 595)Добавлен доступ к элементам Panel через атрибуты и завершение IPython (GH 554)
Реализовать
DataFrame.lookup, аналог fancy-индексирования для получения значений по заданной последовательности меток строк и столбцов (GH 338)Можно передать список функций для агрегации с помощью groupby на DataFrame, получая агрегированный результат с иерархическими столбцами (GH 166)
Можно вызвать
cumminиcummaxна Series и DataFrame для получения кумулятивного минимума и максимума соответственно (GH 647)value_rangeдобавлена как служебная функция для получения минимума и максимума датафрейма (GH 288)Добавлен
encodingаргумент дляread_csv,read_table,to_csvиfrom_csvдля не-ASCII текста (GH 717)Добавлен
absметод для объектов pandasДобавлен
crosstabфункция для простого вычисления частотных таблицДобавлен
isinметод для индексации объектовДобавлен
levelаргумент дляxsметод DataFrame.
Изменения API для целочисленной индексации#
Одно из потенциально самых рискованных изменений API в 0.7.0, но также одно из самых важных, было полным пересмотром того, как целочисленные индексы обрабатываются с учетом индексации по меткам. Вот пример:
In [3]: s = pd.Series(np.random.randn(10), index=range(0, 20, 2))
In [4]: s
Out[4]:
0 -1.294524
2 0.413738
4 0.276662
6 -0.472035
8 -0.013960
10 -0.362543
12 -0.006154
14 -0.923061
16 0.895717
18 0.805244
Length: 10, dtype: float64
In [5]: s[0]
Out[5]: -1.2945235902555294
In [6]: s[2]
Out[6]: 0.41373810535784006
In [7]: s[4]
Out[7]: 0.2766617129497566
Это полностью идентично поведению до изменений. Однако, если вы запросите ключ не содержащиеся в Series, в версиях 0.6.1 и ранее, Series бы
возвращаться к при поиске на основе местоположения. Теперь это вызывает KeyError:
In [2]: s[1]
KeyError: 1
Это изменение также имеет такое же влияние на DataFrame:
In [3]: df = pd.DataFrame(np.random.randn(8, 4), index=range(0, 16, 2))
In [4]: df
0 1 2 3
0 0.88427 0.3363 -0.1787 0.03162
2 0.14451 -0.1415 0.2504 0.58374
4 -1.44779 -0.9186 -1.4996 0.27163
6 -0.26598 -2.4184 -0.2658 0.11503
8 -0.58776 0.3144 -0.8566 0.61941
10 0.10940 -0.7175 -1.0108 0.47990
12 -1.16919 -0.3087 -0.6049 -0.43544
14 -0.07337 0.3410 0.0424 -0.16037
In [5]: df.ix[3]
KeyError: 3
Для поддержки индексации, основанной исключительно на целых числах, были добавлены следующие методы:
Метод |
Описание |
|---|---|
|
Получить значение, хранящееся в местоположении |
|
Псевдоним для |
|
Получить |
|
Получить |
|
Извлечь значение в строке |
Настройки API, касающиеся среза по меткам#
Срез на основе меток с использованием ix теперь требует, чтобы индекс был отсортирован
(монотонным) если только оба начальная и конечная точки содержатся в индексе:
In [1]: s = pd.Series(np.random.randn(6), index=list('gmkaec'))
In [2]: s
Out[2]:
g -1.182230
m -0.276183
k -0.243550
a 1.628992
e 0.073308
c -0.539890
dtype: float64
Тогда это допустимо:
In [3]: s.ix['k':'e']
Out[3]:
k -0.243550
a 1.628992
e 0.073308
dtype: float64
Но это не так:
In [12]: s.ix['b':'h']
KeyError 'b'
Если бы индекс был отсортирован, «выбор диапазона» был бы возможен:
In [4]: s2 = s.sort_index()
In [5]: s2
Out[5]:
a 1.628992
c -0.539890
e 0.073308
g -1.182230
k -0.243550
m -0.276183
dtype: float64
In [6]: s2.ix['b':'h']
Out[6]:
c -0.539890
e 0.073308
g -1.182230
dtype: float64
Изменения в Series [] operator#
В качестве нотационного удобства, вы можете передать последовательность меток или срез меток в Series при получении и установке значений через [] (т.е.
__getitem__ и __setitem__ методы). Поведение будет таким же, как
при передаче аналогичного ввода в ix за исключением случая целочисленного индексирования:
In [8]: s = pd.Series(np.random.randn(6), index=list('acegkm'))
In [9]: s
Out[9]:
a -1.206412
c 2.565646
e 1.431256
g 1.340309
k -1.170299
m -0.226169
Length: 6, dtype: float64
In [10]: s[['m', 'a', 'c', 'e']]
Out[10]:
m -0.226169
a -1.206412
c 2.565646
e 1.431256
Length: 4, dtype: float64
In [11]: s['b':'l']
Out[11]:
c 2.565646
e 1.431256
g 1.340309
k -1.170299
Length: 4, dtype: float64
In [12]: s['c':'k']
Out[12]:
c 2.565646
e 1.431256
g 1.340309
k -1.170299
Length: 4, dtype: float64
В случае целочисленных индексов поведение будет точно таким же, как и раньше
(затенение ndarray):
In [13]: s = pd.Series(np.random.randn(6), index=range(0, 12, 2))
In [14]: s[[4, 0, 2]]
Out[14]:
4 0.132003
0 0.410835
2 0.813850
Length: 3, dtype: float64
In [15]: s[1:5]
Out[15]:
2 0.813850
4 0.132003
6 -0.827317
8 -0.076467
Length: 4, dtype: float64
Если вы хотите выполнять индексацию с последовательностями и срезы на целочисленном индексе с семантикой меток, используйте ix.
Другие изменения API#
Устаревший
LongPanelкласс был полностью удаленЕсли
Series.sortвызывается на столбце DataFrame, теперь будет вызываться исключение. Ранее можно было случайно изменить столбец DataFrame, выполнивdf[col].sort()вместо метода без побочных эффектовdf[col].order()(GH 316)Различные переименования и устаревания, которые (безвредно) вызовут
FutureWarningdropдобавлен как необязательный параметр вDataFrame.reset_index(GH 699)
Улучшения производительности#
Сайтонизированные агрегации GroupBy больше не предварительно сортируют данные, достигая значительного ускорения (GH 93). Групповые агрегации с функциями Python значительно ускорены за счет умного манипулирования типом данных ndarray в Cython (GH 496).
Улучшенное сообщение об ошибке в конструкторе DataFrame, когда переданные метки столбцов не соответствуют данным (GH 497)
Значительно улучшена производительность многогрупповой агрегации, когда передается функция Python, повторное использование объекта ndarray в Cython (GH 496)
Может хранить объекты, индексированные кортежами и числами с плавающей точкой, в HDFStore (GH 492)
Не печатать длину по умолчанию в Series.to_string, добавить
lengthопция (GH 489)Улучшение кода Cython для многократного группирования для агрегации без необходимости сортировки данных (GH 93)
Улучшить скорость переиндексации MultiIndex, сохраняя кортежи в MultiIndex, проверить обратную совместимость распаковки
Улучшение производительности переиндексации столбцов с использованием специализированной функции take на Cython
Дальнейшая оптимизация производительности Series.__getitem__ для стандартных случаев использования
Избегать создания словаря индекса в некоторых случаях (например, при получении срезов и т.д.), регрессия по сравнению с предыдущими версиями
Более дружелюбное сообщение об ошибке в setup.py, если NumPy не установлен
Использовать общий набор операций обработки NA (sum, mean и т.д.) в классе Panel также (GH 536)
Присвоение имени по умолчанию при вызове
reset_indexна DataFrame с обычным (неиерархическим) индексом (GH 476)Используйте цитонизированные группировщики, когда возможно, в статистических операциях Series/DataFrame с
levelпереданный параметр (GH 545)Перенос структуры данных skiplist на C для ускорения
rolling_medianпримерно на 5-10 раз в большинстве типичных случаев использования (GH 374)
Участники#
Всего 18 человек внесли патчи в этот релиз. Люди с «+» рядом с именами внесли патч впервые.
Adam Klein
Bayle Shanks +
Chris Billington +
Dieter Vandenbussche
Фабрицио Полластри +
Graham Taylor +
Gregg Lind +
Josh Klein +
Luca Beltrame
Olivier Grisel +
Skipper Seabold
Томас Клуйвер
Thomas Wiecki +
Wes McKinney
Wouter Overmeire
Yaroslav Halchenko
fabriziop +
theandygross +