Версия 0.13.0 (3 января 2014)#
Это крупный релиз по сравнению с версией 0.12.0, включающий ряд изменений API, несколько новых функций и улучшений, а также большое количество исправлений ошибок.
Основные моменты включают:
поддержка нового типа индекса
Float64Index, и другие улучшения индексированияHDFStoreимеет новый строковый синтаксис для спецификации запросаподдержка новых методов интерполяции
обновлён
timedeltaоперацииновый метод манипуляции строками
extractПоддержка наносекунд для Offsets
isinдля DataFrames
Добавлено несколько экспериментальных функций, включая:
новый
eval/queryметоды для оценки выраженийподдержка для
msgpackсериализацияинтерфейс ввода-вывода к Google
BigQuery
Есть несколько новых или обновленных разделов документации, включая:
Сравнение с SQL, что должно быть полезно для тех, кто знаком с SQL, но еще изучает pandas.
Сравнение с R, идиоматические переводы из R в pandas.
Улучшение производительности, способы повышения производительности pandas с помощью
eval/query.
Предупреждение
В версии 0.13.0 Series был внутренне переработан, чтобы больше не наследовать от ndarray
но вместо этого подкласс NDFrame, аналогично остальным контейнерам pandas. Это должно быть
прозрачным изменением с очень ограниченными последствиями для API. См. Внутренний рефакторинг
Изменения API#
read_excelтеперь поддерживает целое число в своемsheetnameаргумент, указывающий индекс листа для чтения (GH 4301).Текстовый парсер теперь рассматривает всё, что читается как inf (“inf”, “Inf”, “-Inf”, “iNf” и т.д.), как бесконечность. (GH 4220, GH 4219), влияя на
read_table,read_csv, и т.д.pandasтеперь совместим с Python 2/3 без необходимости использования 2to3 благодаря @jtratner. В результате pandas теперь более широко использует итераторы. Это также привело к внедрению существенных частейsixбиблиотеку в compat. (GH 4384, GH 4375, GH 4372)pandas.util.compatиpandas.util.py3compatбыли объединены вpandas.compat.pandas.compatтеперь включает множество функций, обеспечивающих совместимость 2/3. Содержит как списковые, так и итераторные версии range, filter, map и zip, а также другие необходимые элементы для совместимости с Python 3.lmap,lzip,lrangeиlfilterвсе производят списки вместо итераторов, для совместимости сnumpy, индексирование иpandasконструкторы.(GH 4384, GH 4375, GH 4372)Series.getс отрицательными индексами теперь возвращает то же, что и[](GH 4390)Изменения в том, как
IndexиMultiIndexобрабатывать метаданные (levels,labels, иnames) (GH 4039):# previously, you would have set levels or labels directly >>> pd.index.levels = [[1, 2, 3, 4], [1, 2, 4, 4]] # now, you use the set_levels or set_labels methods >>> index = pd.index.set_levels([[1, 2, 3, 4], [1, 2, 4, 4]]) # similarly, for names, you can rename the object # but setting names is not deprecated >>> index = pd.index.set_names(["bob", "cranberry"]) # and all methods take an inplace kwarg - but return None >>> pd.index.set_names(["bob", "cranberry"], inplace=True)
Все деление с
NDFrameобъекты теперь истинное деление, независимо от импорта future. Это означает, что операции с объектами pandas по умолчанию будут использовать с плавающей точкой деление и возврат типа данных с плавающей точкой. Вы можете использовать//иfloordivвыполнять целочисленное деление.Целочисленное деление
In [3]: arr = np.array([1, 2, 3, 4]) In [4]: arr2 = np.array([5, 3, 2, 1]) In [5]: arr / arr2 Out[5]: array([0, 0, 1, 4]) In [6]: pd.Series(arr) // pd.Series(arr2) Out[6]: 0 0 1 0 2 1 3 4 dtype: int64
Истинное деление
In [7]: pd.Series(arr) / pd.Series(arr2) # no future import required Out[7]: 0 0.200000 1 0.666667 2 1.500000 3 4.000000 dtype: float64
Определить и понизить dtype, если
downcast='infer'передаётся вfillna/ffill/bfill(GH 4604)__nonzero__для всех объектов NDFrame теперь будет вызыватьValueError, это возвращается к (GH 1073, GH 4633) поведение. См. подводные камни для более подробного обсуждения.Это предотвращает выполнение логического сравнения на весь объекты pandas, что по своей природе неоднозначно. Все они будут вызывать
ValueError.>>> df = pd.DataFrame({'A': np.random.randn(10), ... 'B': np.random.randn(10), ... 'C': pd.date_range('20130101', periods=10) ... }) ... >>> if df: ... pass ... Traceback (most recent call last): ... ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). >>> df1 = df >>> df2 = df >>> df1 and df2 Traceback (most recent call last): ... ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). >>> d = [1, 2, 3] >>> s1 = pd.Series(d) >>> s2 = pd.Series(d) >>> s1 and s2 Traceback (most recent call last): ... ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
Добавлен
.bool()метод дляNDFrameобъекты для облегчения оценки булевых Series с одним элементом:>>> pd.Series([True]).bool() True >>> pd.Series([False]).bool() False >>> pd.DataFrame([[True]]).bool() True >>> pd.DataFrame([[False]]).bool() False
Все не-Index NDFrames (
Series,DataFrame,Panel,Panel4D,SparsePanel, и т.д.), теперь поддерживают полный набор арифметических операторов и гибких арифметических методов (add, sub, mul и т.д.).SparsePanelне поддерживаетpowилиmodс нескалярными значениями. (GH 3765)SeriesиDataFrameтеперь имеютmode()метод для вычисления статистической моды (мод) по оси/Series. (GH 5367)Цепное присваивание теперь по умолчанию будет предупреждать, если пользователь присваивает копии. Это можно изменить с помощью опции
mode.chained_assignment, допустимые варианты:raise/warn/None. См. документация.In [1]: dfc = pd.DataFrame({'A': ['aaa', 'bbb', 'ccc'], 'B': [1, 2, 3]}) In [2]: pd.set_option('chained_assignment', 'warn')
Следующее предупреждение / исключение будет показано, если это будет предпринято.
In [3]: dfc.loc[0]['A'] = 1111
Traceback (most recent call last) ... SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_index,col_indexer] = value instead
Вот правильный метод присваивания.
In [4]: dfc.loc[0, 'A'] = 11 In [5]: dfc Out[5]: A B 0 11 1 1 bbb 2 2 ccc 3
Panel.reindexимеет следующую сигнатуру вызоваPanel.reindex(items=None, major_axis=None, minor_axis=None, **kwargs)чтобы соответствовать другим
NDFrameобъектов. См. Внутренний рефакторинг для получения дополнительной информации.
Series.argminиSeries.argmaxтеперь являются псевдонимами дляSeries.idxminиSeries.idxmax. Они возвращают index изминимальный или максимальный элемент соответственно. До версии 0.13.0 они возвращали позицию минимального / максимального элемента. (GH 6214)
Устаревшие функции/изменения в предыдущих версиях#
Это объявленные изменения в версии 0.12 или ранее, которые вступают в силу с версии 0.13.0
Удалить устаревшее
Factor(GH 3650)Удалить устаревшее
set_printoptions/reset_printoptions(GH 3046)Удалить устаревшее
_verbose_info(GH 3215)Удалить устаревшее
read_clipboard/to_clipboard/ExcelFile/ExcelWriterизpandas.io.parsers(GH 3717) Они доступны как функции в основном пространстве имен pandas (например,pd.read_clipboard)по умолчанию для
tupleize_colsтеперьFalseдля обоихto_csvиread_csv. Предупреждение в версии 0.12 (GH 3604)по умолчанию для
display.max_seq_lenтеперь 100 вместоNone. Это активирует усеченное отображение ("…") длинных последовательностей в различных местах. (GH 3391)
Устаревшие функции#
Устарело в 0.13.0
устаревший
iterkv, который будет удален в будущем выпуске (это был псевдоним iteritems, использовавшийся для обхода2to3’s changes). (GH 4384, GH 4375, GH 4372)устарел строковый метод
match, чья роль теперь выполняется более идиоматично с помощьюextract. В будущем релизе поведение по умолчанию уmatchизменится, чтобы стать аналогичнымcontains, который возвращает логический индексатор. (Их различие в строгости:matchосновывается наre.matchв то время какcontainsосновывается наre.search.) В этом выпуске устаревшее поведение является стандартным, но новое поведение доступно через ключевой аргументas_indexer=True.
Изменения в API индексирования#
До версии 0.13 было невозможно использовать индекс метки (.loc/.ix) для установки значения,
которое не содержалось в индексе определенной оси. (GH 2578). См. документация
В Series в этом случае это фактически операция добавления
In [6]: s = pd.Series([1, 2, 3])
In [7]: s
Out[7]:
0 1
1 2
2 3
dtype: int64
In [8]: s[5] = 5.
In [9]: s
Out[9]:
0 1.0
1 2.0
2 3.0
5 5.0
dtype: float64
In [10]: dfi = pd.DataFrame(np.arange(6).reshape(3, 2),
....: columns=['A', 'B'])
....:
In [11]: dfi
Out[11]:
A B
0 0 1
1 2 3
2 4 5
Ранее это могло KeyError
In [12]: dfi.loc[:, 'C'] = dfi.loc[:, 'A']
In [13]: dfi
Out[13]:
A B C
0 0 1 0
1 2 3 2
2 4 5 4
Это похоже на append операция.
In [14]: dfi.loc[3] = 5
In [15]: dfi
Out[15]:
A B C
0 0 1 0
1 2 3 2
2 4 5 4
3 5 5 5
Операция установки Panel на произвольной оси выравнивает входные данные к Panel
In [20]: p = pd.Panel(np.arange(16).reshape(2, 4, 2),
....: items=['Item1', 'Item2'],
....: major_axis=pd.date_range('2001/1/12', periods=4),
....: minor_axis=['A', 'B'], dtype='float64')
....:
In [21]: p
Out[21]:
Dimensions: 2 (items) x 4 (major_axis) x 2 (minor_axis)
Items axis: Item1 to Item2
Major_axis axis: 2001-01-12 00:00:00 to 2001-01-15 00:00:00
Minor_axis axis: A to B
In [22]: p.loc[:, :, 'C'] = pd.Series([30, 32], index=p.items)
In [23]: p
Out[23]:
Dimensions: 2 (items) x 4 (major_axis) x 3 (minor_axis)
Items axis: Item1 to Item2
Major_axis axis: 2001-01-12 00:00:00 to 2001-01-15 00:00:00
Minor_axis axis: A to C
In [24]: p.loc[:, :, 'C']
Out[24]:
Item1 Item2
2001-01-12 30.0 32.0
2001-01-13 30.0 32.0
2001-01-14 30.0 32.0
2001-01-15 30.0 32.0
Изменение API Float64Index#
Добавлен новый тип индекса,
Float64Index. Это будет автоматически создано при передаче значений с плавающей точкой при создании индекса. Это позволяет использовать чисто меточную парадигму срезов, которая делает[],ix,locдля скалярного индексирования и срезов работают точно так же. (GH 263)Конструкция по умолчанию предназначена для значений с плавающей точкой.
In [16]: index = pd.Index([1.5, 2, 3, 4.5, 5]) In [17]: index Out[17]: Index([1.5, 2.0, 3.0, 4.5, 5.0], dtype='float64') In [18]: s = pd.Series(range(5), index=index) In [19]: s Out[19]: 1.5 0 2.0 1 3.0 2 4.5 3 5.0 4 dtype: int64
Скалярный выбор для
[],.ix,.locвсегда будет основано на метках. Целое число будет соответствовать равному индексу с плавающей точкой (например,3эквивалентно3.0)In [20]: s[3] Out[20]: 2 In [21]: s.loc[3] Out[21]: 2
Единственная позиционная индексация осуществляется через
ilocIn [22]: s.iloc[3] Out[22]: 3
Не найденный скалярный индекс вызовет исключение
KeyErrorСрезы ВСЕГДА применяются к значениям индекса, для
[],ix,locи ВСЕГДА позиционный сilocIn [23]: s[2:4] Out[23]: 2.0 1 3.0 2 dtype: int64 In [24]: s.loc[2:4] Out[24]: 2.0 1 3.0 2 dtype: int64 In [25]: s.iloc[2:4] Out[25]: 3.0 2 4.5 3 dtype: int64
В индексах с плавающей точкой разрешено срезы с использованием чисел с плавающей точкой
In [26]: s[2.1:4.6] Out[26]: 3.0 2 4.5 3 dtype: int64 In [27]: s.loc[2.1:4.6] Out[27]: 3.0 2 4.5 3 dtype: int64
Индексирование на других типах индексов сохраняется (и позиционный откат для
[],ix), за исключением того, что срез с плавающей точкой по индексам на неFloat64Indexтеперь вызоветTypeError.In [1]: pd.Series(range(5))[3.5] TypeError: the label [3.5] is not a proper indexer for this index type (Int64Index) In [1]: pd.Series(range(5))[3.5:4.5] TypeError: the slice start [3.5] is not a proper indexer for this index type (Int64Index)
Использование скалярного индексатора с плавающей точкой будет устаревшим в будущей версии, но пока разрешено.
In [3]: pd.Series(range(5))[3.0] Out[3]: 3
Изменения в API HDFStore#
Изменения формата запросов. Теперь поддерживается более строкоподобный формат запросов. См. документация.
In [28]: path = 'test.h5' In [29]: dfq = pd.DataFrame(np.random.randn(10, 4), ....: columns=list('ABCD'), ....: index=pd.date_range('20130101', periods=10)) ....: In [30]: dfq.to_hdf(path, key='dfq', format='table', data_columns=True)
Используйте логические выражения с встроенной оценкой функций.
In [31]: pd.read_hdf(path, 'dfq', ....: where="index>Timestamp('20130104') & columns=['A', 'B']") ....: Out[31]: A B 2013-01-05 -0.424972 0.567020 2013-01-06 -0.673690 0.113648 2013-01-07 0.404705 0.577046 2013-01-08 -0.370647 -1.157892 2013-01-09 1.075770 -0.109050 2013-01-10 0.357021 -0.674600
Используйте встроенную ссылку на столбец
In [32]: pd.read_hdf(path, 'dfq', ....: where="A>0 or C>0") ....: Out[32]: A B C D 2013-01-01 0.469112 -0.282863 -1.509059 -1.135632 2013-01-02 1.212112 -0.173215 0.119209 -1.044236 2013-01-04 0.721555 -0.706771 -1.039575 0.271860 2013-01-05 -0.424972 0.567020 0.276232 -1.087401 2013-01-07 0.404705 0.577046 -1.715002 -1.039268 2013-01-09 1.075770 -0.109050 1.643563 -1.469388 2013-01-10 0.357021 -0.674600 -1.776904 -0.968914
the
formatключевое слово теперь заменяетtableключевое слово; допустимые значения:fixed(f)илиtable(t)те же значения по умолчанию, что и до версии < 0.13.0, остаются, например,putподразумеваетfixedформат иappendподразумеваетtableформат. Этот формат по умолчанию можно установить как опцию, задавio.hdf.default_format.In [33]: path = 'test.h5' In [34]: df = pd.DataFrame(np.random.randn(10, 2)) In [35]: df.to_hdf(path, key='df_table', format='table') In [36]: df.to_hdf(path, key='df_table2', append=True) In [37]: df.to_hdf(path, key='df_fixed') In [38]: with pd.HDFStore(path) as store: ....: print(store) ....:
File path: test.h5 Значительные улучшения производительности записи таблиц
обрабатывать переданный
Seriesв табличном формате (GH 4330)теперь может сериализовать
timedelta64[ns]тип данных в таблице (GH 3577), См. документация.добавлен
is_openсвойство, указывающее, открыт ли базовый файловый дескриптор; закрытое хранилище теперь будет отображать 'CLOSED' при просмотре хранилища (вместо вызова ошибки) (GH 4409)закрытие
HDFStoreтеперь закроет этот экземплярHDFStoreно закроет фактический файл только если счетчик ссылок (поPyTables) относительно всех открытых дескрипторов равны 0. По сути, у вас есть локальный экземплярHDFStoreссылается на переменную. После закрытия он будет отмечен как закрытый. Другие ссылки (на тот же файл) продолжат работать, пока они сами не будут закрыты. Выполнение действия с закрытым файлом вызоветClosedFileErrorIn [39]: path = 'test.h5' In [40]: df = pd.DataFrame(np.random.randn(10, 2)) In [41]: store1 = pd.HDFStore(path) In [42]: store2 = pd.HDFStore(path) In [43]: store1.append('df', df) In [44]: store2.append('df2', df) In [45]: store1 Out[45]:
File path: test.h5 In [46]: store2 Out[46]: File path: test.h5 In [47]: store1.close() In [48]: store2 Out[48]: File path: test.h5 In [49]: store2.close() In [50]: store2 Out[50]: File path: test.h5 удалил
_quietатрибут, заменить наDuplicateWarningесли извлечение дублирующихся строк из таблицы (GH 4367)удалил
warnаргумент изopen. Вместо этогоPossibleDataLossErrorбудет вызвано исключение, если вы попытаетесь использоватьmode='w'с ОТКРЫТЫМ файловым дескриптором (GH 4367)разрешить переданный массив местоположений или маску как
whereусловие (GH 4467). См. документация для примера.добавить ключевое слово
dropna=Truetoappendчтобы изменить, записываются ли ВСЕ строки с nan в хранилище (по умолчаниюTrue, ВСЕ строки с nan НЕ записываются), также настраивается через опциюio.hdf.dropna_table(GH 4625)передать аргументы создания хранилища; может использоваться для поддержки хранилищ в памяти
Изменения в представлении DataFrame#
HTML и текстовые представления DataFrame теперь показывать
усечённое представление таблицы при превышении определённого размера, вместо
переключения на краткий информационный вид (GH 4886, GH 5550). Это делает представление более согласованным по мере увеличения небольших DataFrames.
Чтобы получить представление info, вызовите DataFrame.info(). Если вы предпочитаете
представление info в качестве repr для больших DataFrame, вы можете установить это, запустив
set_option('display.large_repr', 'info').
Улучшения#
df.to_clipboard()изучил новыйexcelключевое слово, которое позволяет вставлять данные df непосредственно в Excel (включено по умолчанию). (GH 5070).read_htmlтеперь вызываетURLErrorвместо перехвата и вызоваValueError(GH 4303, GH 4305)Добавлен тест для
read_clipboard()иto_clipboard()(GH 4282)Функциональность буфера обмена теперь работает с PySide (GH 4282)
Добавлено более информативное сообщение об ошибке, когда аргументы графика содержат перекрывающиеся аргументы цвета и стиля (GH 4402)
to_dictтеперь принимаетrecordsкак возможный тип вывода. Возвращает массив словарей с ключами-столбцами. (GH 4936)NaNпередача в get_dummies (GH 4446) сdummy_na# previously, nan was erroneously counted as 2 here # now it is not counted at all In [51]: pd.get_dummies([1, 2, np.nan]) Out[51]: 1.0 2.0 0 True False 1 False True 2 False False # unless requested In [52]: pd.get_dummies([1, 2, np.nan], dummy_na=True) Out[52]: 1.0 2.0 NaN 0 True False False 1 False True False 2 False False True
timedelta64[ns]операции. См. документация.Предупреждение
Большинство этих операций требуют
numpy >= 1.7Используя новый верхнеуровневый
to_timedelta, вы можете преобразовать скаляр или массив из стандартного формата timedelta (созданногоto_csv) в тип timedelta (np.timedelta64вnanoseconds).In [53]: pd.to_timedelta('1 days 06:05:01.00003') Out[53]: Timedelta('1 days 06:05:01.000030') In [54]: pd.to_timedelta('15.5us') Out[54]: Timedelta('0 days 00:00:00.000015500') In [55]: pd.to_timedelta(['1 days 06:05:01.00003', '15.5us', 'nan']) Out[55]: TimedeltaIndex(['1 days 06:05:01.000030', '0 days 00:00:00.000015500', NaT], dtype='timedelta64[ns]', freq=None) In [56]: pd.to_timedelta(np.arange(5), unit='s') Out[56]: TimedeltaIndex(['0 days 00:00:00', '0 days 00:00:01', '0 days 00:00:02', '0 days 00:00:03', '0 days 00:00:04'], dtype='timedelta64[ns]', freq=None) In [57]: pd.to_timedelta(np.arange(5), unit='d') Out[57]: TimedeltaIndex(['0 days', '1 days', '2 days', '3 days', '4 days'], dtype='timedelta64[ns]', freq=None)
Series типа данных
timedelta64[ns]теперь можно разделить на другойtimedelta64[ns]объект, или приведённый к типу для полученияfloat64Series с типом данных. Это преобразование частоты. См. документация для документации.In [58]: import datetime In [59]: td = pd.Series(pd.date_range('20130101', periods=4)) - pd.Series( ....: pd.date_range('20121201', periods=4)) ....: In [60]: td[2] += np.timedelta64(datetime.timedelta(minutes=5, seconds=3)) In [61]: td[3] = np.nan In [62]: td Out[62]: 0 31 days 00:00:00 1 31 days 00:00:00 2 31 days 00:05:03 3 NaT dtype: timedelta64[ns]
# to days In [63]: td / np.timedelta64(1, 'D') Out[63]: 0 31.000000 1 31.000000 2 31.003507 3 NaN dtype: float64 In [64]: td.astype('timedelta64[D]') Out[64]: 0 31.0 1 31.0 2 31.0 3 NaN dtype: float64 # to seconds In [65]: td / np.timedelta64(1, 's') Out[65]: 0 2678400.0 1 2678400.0 2 2678703.0 3 NaN dtype: float64 In [66]: td.astype('timedelta64[s]') Out[66]: 0 2678400.0 1 2678400.0 2 2678703.0 3 NaN dtype: float64
Деление или умножение
timedelta64[ns]Series на целое число или целочисленный SeriesIn [63]: td * -1 Out[63]: 0 -31 days +00:00:00 1 -31 days +00:00:00 2 -32 days +23:54:57 3 NaT dtype: timedelta64[ns] In [64]: td * pd.Series([1, 2, 3, 4]) Out[64]: 0 31 days 00:00:00 1 62 days 00:00:00 2 93 days 00:15:09 3 NaT dtype: timedelta64[ns]
Абсолютное
DateOffsetобъекты могут действовать аналогичноtimedeltasIn [65]: from pandas import offsets In [66]: td + offsets.Minute(5) + offsets.Milli(5) Out[66]: 0 31 days 00:05:00.005000 1 31 days 00:05:00.005000 2 31 days 00:10:03.005000 3 NaT dtype: timedelta64[ns]
Fillna теперь поддерживается для временных интервалов
In [67]: td.fillna(pd.Timedelta(0)) Out[67]: 0 31 days 00:00:00 1 31 days 00:00:00 2 31 days 00:05:03 3 0 days 00:00:00 dtype: timedelta64[ns] In [68]: td.fillna(datetime.timedelta(days=1, seconds=5)) Out[68]: 0 31 days 00:00:00 1 31 days 00:00:00 2 31 days 00:05:03 3 1 days 00:00:05 dtype: timedelta64[ns]
Вы можете выполнять числовые операции сокращения над timedeltas.
In [69]: td.mean() Out[69]: Timedelta('31 days 00:01:41') In [70]: td.quantile(.1) Out[70]: Timedelta('31 days 00:00:00')
plot(kind='kde')теперь принимает необязательные параметрыbw_methodиind, переданные в scipy.stats.gaussian_kde() (для scipy >= 0.11.0) для установки полосы пропускания, и в gkde.evaluate() для указания индексов, по которым она оценивается, соответственно. См. документацию scipy. (GH 4298)Конструктор DataFrame теперь принимает маскированный записной массив numpy (GH 3478)
Новый векторизованный строковый метод
extractвозвращает совпадения регулярных выражений более удобно.In [71]: pd.Series(['a1', 'b2', 'c3']).str.extract('[ab](\\d)') Out[71]: 0 0 1 1 2 2 NaN
Элементы, которые не совпадают, возвращают
NaN. Извлечение регулярного выражения с более чем одной группой возвращает DataFrame с одним столбцом на группу.In [72]: pd.Series(['a1', 'b2', 'c3']).str.extract('([ab])(\\d)') Out[72]: 0 1 0 a 1 1 b 2 2 NaN NaN
Элементы, которые не совпадают, возвращают строку
NaN. Таким образом, Series из неупорядоченных строк может быть преобразовано в похожий по индексу Series или DataFrame очищенных или более полезных строк, без необходимостиget()для доступа к кортежам илиre.matchобъекты.Именованные группы, такие как
In [73]: pd.Series(['a1', 'b2', 'c3']).str.extract( ....: '(?P
[ab])(?P \\d)') ....: Out[73]: letter digit 0 a 1 1 b 2 2 NaN NaNи необязательные группы также могут использоваться.
In [74]: pd.Series(['a1', 'b2', '3']).str.extract( ....: '(?P
[ab])?(?P \\d)') ....: Out[74]: letter digit 0 a 1 1 b 2 2 NaN 3read_stataтеперь принимает формат Stata 13 (GH 4291)read_fwfтеперь выводит спецификации столбцов из первых 100 строк файла, если данные имеют правильно разделенные и выровненные столбцы с использованием разделителя, предоставленного функции (GH 4488).поддержка наносекундных времен как смещения
Предупреждение
Эти операции требуют
numpy >= 1.7Преобразования периодов в диапазоне секунд и ниже были переработаны и расширены до наносекунд. Теперь доступны периоды в наносекундном диапазоне.
In [79]: pd.date_range('2013-01-01', periods=5, freq='5N') Out[79]: DatetimeIndex([ '2013-01-01 00:00:00', '2013-01-01 00:00:00.000000005', '2013-01-01 00:00:00.000000010', '2013-01-01 00:00:00.000000015', '2013-01-01 00:00:00.000000020'], dtype='datetime64[ns]', freq='5N')
или с частотой как смещение
In [75]: pd.date_range('2013-01-01', periods=5, freq=pd.offsets.Nano(5)) Out[75]: DatetimeIndex([ '2013-01-01 00:00:00', '2013-01-01 00:00:00.000000005', '2013-01-01 00:00:00.000000010', '2013-01-01 00:00:00.000000015', '2013-01-01 00:00:00.000000020'], dtype='datetime64[ns]', freq='5ns')
Метки времени могут быть изменены в наносекундном диапазоне
In [76]: t = pd.Timestamp('20130101 09:01:02') In [77]: t + pd.tseries.offsets.Nano(123) Out[77]: Timestamp('2013-01-01 09:01:02.000000123')
Новый метод,
isinдля DataFrames, что хорошо сочетается с булевым индексированием. Аргумент дляisin, с чем мы сравниваем DataFrame, может быть DataFrame, Series, dict или массив значений. См. документация подробнее.Чтобы получить строки, где выполнено любое из условий:
In [78]: dfi = pd.DataFrame({'A': [1, 2, 3, 4], 'B': ['a', 'b', 'f', 'n']}) In [79]: dfi Out[79]: A B 0 1 a 1 2 b 2 3 f 3 4 n In [80]: other = pd.DataFrame({'A': [1, 3, 3, 7], 'B': ['e', 'f', 'f', 'e']}) In [81]: mask = dfi.isin(other) In [82]: mask Out[82]: A B 0 True False 1 False False 2 True True 3 False False In [83]: dfi[mask.any(axis=1)] Out[83]: A B 0 1 a 2 3 f
Seriesтеперь поддерживаетto_frameметод для преобразования в DataFrame с одним столбцом (GH 5164)Все наборы данных R, перечисленные здесь http://stat.ethz.ch/R-manual/R-devel/library/datasets/html/00Index.html теперь можно загружать в объекты pandas
# note that pandas.rpy was deprecated in v0.16.0 import pandas.rpy.common as com com.load_data('Titanic')
tz_localizeможет определить переход на летнее время на основе структуры нелокализованных данных (GH 4230), см. документацияDatetimeIndexтеперь находится в документации API, см. документацияjson_normalize()это новый метод, позволяющий создавать плоскую таблицу из полуструктурированных JSON-данных. См. документация (GH 1067)Добавлена поддержка PySide для qtpandas DataFrameModel и DataFrameWidget.
Парсер CSV Python теперь поддерживает usecols (GH 4335)
Частоты получили несколько новых смещений:
DataFrame имеет новый
interpolateметод, аналогичный Series (GH 4434, GH 1892)In [84]: df = pd.DataFrame({'A': [1, 2.1, np.nan, 4.7, 5.6, 6.8], ....: 'B': [.25, np.nan, np.nan, 4, 12.2, 14.4]}) ....: In [85]: df.interpolate() Out[85]: A B 0 1.0 0.25 1 2.1 1.50 2 3.4 2.75 3 4.7 4.00 4 5.6 12.20 5 6.8 14.40
Кроме того,
methodаргумент дляinterpolateбыл расширен чтобы включить'nearest', 'zero', 'slinear', 'quadratic', 'cubic', 'barycentric', 'krogh', 'piecewise_polynomial', 'pchip', 'polynomial', 'spline'Новые методы требуют scipy. Обратитесь к справочнику Scipy руководство и документация для получения дополнительной информации о том, когда различные методы уместны. См. документация.Interpolate теперь также принимает
limitаргумент ключевого слова. Это работает аналогичноfillnaограничение:In [86]: ser = pd.Series([1, 3, np.nan, np.nan, np.nan, 11]) In [87]: ser.interpolate(limit=2) Out[87]: 0 1.0 1 3.0 2 5.0 3 7.0 4 NaN 5 11.0 dtype: float64
Добавлен
wide_to_longудобная функция для панельных данных. См. документация.In [88]: np.random.seed(123) In [89]: df = pd.DataFrame({"A1970" : {0 : "a", 1 : "b", 2 : "c"}, ....: "A1980" : {0 : "d", 1 : "e", 2 : "f"}, ....: "B1970" : {0 : 2.5, 1 : 1.2, 2 : .7}, ....: "B1980" : {0 : 3.2, 1 : 1.3, 2 : .1}, ....: "X" : dict(zip(range(3), np.random.randn(3))) ....: }) ....: In [90]: df["id"] = df.index In [91]: df Out[91]: A1970 A1980 B1970 B1980 X id 0 a d 2.5 3.2 -1.085631 0 1 b e 1.2 1.3 0.997345 1 2 c f 0.7 0.1 0.282978 2 In [92]: pd.wide_to_long(df, ["A", "B"], i="id", j="year") Out[92]: X A B id year 0 1970 -1.085631 a 2.5 1 1970 0.997345 b 1.2 2 1970 0.282978 c 0.7 0 1980 -1.085631 d 3.2 1 1980 0.997345 e 1.3 2 1980 0.282978 f 0.1
to_csvтеперь принимаетdate_formatключевой аргумент, который определяет, как должны форматироваться выходные объекты datetime. Форматирование будет применено ко всем объектам datetime, встречающимся в индексе, столбцах и значениях. (GH 4313)DataFrame.plotбудет строить диаграмму рассеяния x против y, передаваяkind='scatter'(GH 2215)Добавлена поддержка идентификаторов сегментов Google Analytics v3 API, которая также поддерживает идентификаторы v2. (GH 5271)
Экспериментальный#
Новый
eval()функция реализует вычисление выражений с использованиемnumexprза кулисами. Это приводит к значительному ускорению для сложных выражений, включающих большие DataFrames/Series. Например,In [93]: nrows, ncols = 20000, 100 In [94]: df1, df2, df3, df4 = [pd.DataFrame(np.random.randn(nrows, ncols)) ....: for _ in range(4)] ....:
# eval with NumExpr backend In [95]: %timeit pd.eval('df1 + df2 + df3 + df4') 7.71 ms +- 273 us per loop (mean +- std. dev. of 7 runs, 100 loops each)
# pure Python evaluation In [96]: %timeit df1 + df2 + df3 + df4 7.19 ms +- 306 us per loop (mean +- std. dev. of 7 runs, 100 loops each)
Для получения дополнительной информации см. документация
Аналогично
pandas.eval,DataFrameимеет новыйDataFrame.evalметод, который вычисляет выражение в контекстеDataFrame. Например,In [97]: df = pd.DataFrame(np.random.randn(10, 2), columns=['a', 'b']) In [98]: df.eval('a + b') Out[98]: 0 -0.685204 1 1.589745 2 0.325441 3 -1.784153 4 -0.432893 5 0.171850 6 1.895919 7 3.065587 8 -0.092759 9 1.391365 dtype: float64
query()метод был добавлен, что позволяет выбирать элементыDataFrameиспользуя естественный синтаксис запросов, почти идентичный синтаксису Python. Например,In [99]: n = 20 In [100]: df = pd.DataFrame(np.random.randint(n, size=(n, 3)), columns=['a', 'b', 'c']) In [101]: df.query('a < b < c') Out[101]: a b c 11 1 5 8 15 8 16 19
выбирает все строки
dfгдеa < b < cвычисляется какTrue. Для получения дополнительных сведений см. документация.pd.read_msgpack()иpd.to_msgpack()теперь являются поддерживаемым методом сериализации произвольных объектов pandas (и Python) в лёгкий переносимый двоичный формат. См. документацияПредупреждение
Поскольку это ЭКСПЕРИМЕНТАЛЬНАЯ БИБЛИОТЕКА, формат хранения может быть нестабильным до будущего выпуска.
df = pd.DataFrame(np.random.rand(5, 2), columns=list('AB')) df.to_msgpack('foo.msg') pd.read_msgpack('foo.msg') s = pd.Series(np.random.rand(5), index=pd.date_range('20130101', periods=5)) pd.to_msgpack('foo.msg', df, s) pd.read_msgpack('foo.msg')
Вы можете передать
iterator=Trueв итератор по распакованным результатамfor o in pd.read_msgpack('foo.msg', iterator=True): print(o)
pandas.io.gbqпредоставляет простой способ извлечения данных из и загрузки данных в наборы данных Google BigQuery с помощью pandas DataFrames. BigQuery — это высокопроизводительный сервис базы данных, похожий на SQL, полезный для выполнения специальных запросов к чрезвычайно большим наборам данных. См. документациюfrom pandas.io import gbq # A query to select the average monthly temperatures in the # in the year 2000 across the USA. The dataset, # publicata:samples.gsod, is available on all BigQuery accounts, # and is based on NOAA gsod data. query = """SELECT station_number as STATION, month as MONTH, AVG(mean_temp) as MEAN_TEMP FROM publicdata:samples.gsod WHERE YEAR = 2000 GROUP BY STATION, MONTH ORDER BY STATION, MONTH ASC""" # Fetch the result set for this query # Your Google BigQuery Project ID # To find this, see your dashboard: # https://console.developers.google.com/iam-admin/projects?authuser=0 projectid = 'xxxxxxxxx' df = gbq.read_gbq(query, project_id=projectid) # Use pandas to process and reshape the dataset df2 = df.pivot(index='STATION', columns='MONTH', values='MEAN_TEMP') df3 = pd.concat([df2.min(), df2.mean(), df2.max()], axis=1, keys=["Min Tem", "Mean Temp", "Max Temp"])
Результирующий DataFrame:
> df3 Min Tem Mean Temp Max Temp MONTH 1 -53.336667 39.827892 89.770968 2 -49.837500 43.685219 93.437932 3 -77.926087 48.708355 96.099998 4 -82.892858 55.070087 97.317240 5 -92.378261 61.428117 102.042856 6 -77.703334 65.858888 102.900000 7 -87.821428 68.169663 106.510714 8 -89.431999 68.614215 105.500000 9 -86.611112 63.436935 107.142856 10 -78.209677 56.880838 92.103333 11 -50.125000 48.861228 94.996428 12 -50.332258 42.286879 94.396774
Предупреждение
Для использования этого модуля вам понадобится аккаунт BigQuery. См. <https://cloud.google.com/products/big-query> для подробностей.
По состоянию на 10/10/13, в API Google есть ошибка, не позволяющая наборам результатов превышать 100 000 строк. Исправление запланировано на неделю 10/14/13.
Внутренний рефакторинг#
В версии 0.13.0 проведён крупный рефакторинг, в основном для создания подкласса Series из
NDFrame, который в настоящее время является базовым классом для DataFrame и Panel, чтобы унифицировать методы и поведение. Series ранее наследовались напрямую от
ndarray. (GH 4080, GH 3862, GH 816)
Предупреждение
Есть две потенциальные несовместимости с версией < 0.13.0
Использование некоторых функций numpy ранее возвращало
Seriesесли переданSeriesв качестве аргумента. Это, кажется, влияет только наnp.ones_like,np.empty_like,np.diffиnp.where. Теперь они возвращаютndarrays.In [102]: s = pd.Series([1, 2, 3, 4])
Использование Numpy
In [103]: np.ones_like(s) Out[103]: array([1, 1, 1, 1]) In [104]: np.diff(s) Out[104]: array([1, 1, 1]) In [105]: np.where(s > 1, s, np.nan) Out[105]: array([nan, 2., 3., 4.])
Идиоматическое использование pandas
In [106]: pd.Series(1, index=s.index) Out[106]: 0 1 1 1 2 1 3 1 dtype: int64 In [107]: s.diff() Out[107]: 0 NaN 1 1.0 2 1.0 3 1.0 dtype: float64 In [108]: s.where(s > 1) Out[108]: 0 NaN 1 2.0 2 3.0 3 4.0 dtype: float64
Передача
Seriesнепосредственно в функцию cython, ожидающуюndarrayтип больше не будет работать напрямую, вы должны передатьSeries.values, См. Улучшение производительностиSeries(0.5)ранее возвращал скаляр0.5, вместо этого вернется 1-элементныйSeriesЭто изменение нарушает
rpy2<=2.3.8. Была открыта проблема против rpy2, и обходное решение подробно описано в GH 5698. Спасибо @JanSchulz.
Совместимость с pickle сохраняется для pickle, созданных до версии 0.13. Они должны быть распакованы с помощью
pd.read_pickle, см. Сериализация (Pickling).Рефакторинг series.py/frame.py/panel.py для перемещения общего кода в generic.py
добавлен
_setup_axesдля создания общих структур NDFrameперемещенные методы
from_axes,_wrap_array,axes,ix,loc,iloc,shape,empty,swapaxes,transpose,pop__iter__,keys,__contains__,__len__,__neg__,__invert__convert_objects,as_blocks,as_matrix,values__getstate__,__setstate__(совместимость остаётся в frame/panel)__getattr__,__setattr___indexed_same,reindex_like,align,where,maskfillna,replace(Seriesтеперь согласован сDataFrame)filter(также добавлен аргумент axis для выборочной фильтрации по другой оси)reindex,reindex_axis,taketruncate(перемещено, чтобы стать частьюNDFrame)
Это изменения в API, которые делают
Panelболее согласованно сDataFrameswapaxesнаPanelс теми же указанными осями теперь возвращает копиюподдержка доступа к атрибутам для установки
filter поддерживает тот же API, что и оригинальный
DataFramefilter
Reindex, вызванный без аргументов, теперь вернет копию входного объекта
TimeSeriesтеперь является псевдонимом дляSeries. свойствоis_time_seriesможно использовать для различения (при необходимости)Рефакторинг Sparse объектов для использования BlockManager
Создан новый тип блока во внутренней структуре,
SparseBlock, который может содержать несколько типов данных и не является консолидируемым.SparseSeriesиSparseDataFrameтеперь наследуют больше методов из своей иерархии (Series/DataFrame) и больше не наследуют отSparseArray(который вместо этого является объектомSparseBlock)Набор Sparse теперь поддерживает интеграцию с неразреженными данными. Не-вещественные разреженные данные поддерживаются (частично реализовано)
Операции над разреженными структурами внутри DataFrame должны сохранять разреженность, операции слияния типов преобразуют в плотные (и обратно в разреженные), поэтому могут быть несколько неэффективными
включить setitem на
SparseSeriesдля boolean/integer/slicesSparsePanelsреализация не изменена (например, не использует BlockManager, требует доработки)
добавлен
ftypesметод для Series/DataFrame, аналогичныйdtypes, но указывает, является ли базовый объект разреженным/плотным (а также тип данных)Все
NDFrameобъекты теперь могут использовать__finalize__()для указания различных значений, передаваемых новым объектам из существующего (например,nameвSeriesтеперь будет следовать более автоматически)Внутренняя проверка типов теперь выполняется с помощью набора сгенерированных классов, позволяя
isinstance(value, klass)без необходимости напрямую импортировать класс, благодаря @jtratnerОшибка в обновлении Series, когда родительский фрейм не обновляет свой кэш на основе изменений (GH 4080) или типов (GH 3217), fillna (GH 3386)
Исправлено индексирование с преобразованием типов данных (GH 4463, GH 4204)
Рефакторинг
Series.reindexв core/generic.py (GH 4604, GH 4618), разрешитьmethod=при переиндексации в Series для работыSeries.copyбольше не принимаетorderпараметр и теперь согласован сNDFramecopyРефакторинг
renameметоды в core/generic.py; исправленияSeries.renameдля (GH 4605), и добавляетrenameс той же сигнатурой дляPanelРефакторинг
clipметоды в core/generic.py (GH 4798)Рефакторинг
_get_numeric_data/_get_bool_dataв core/generic.py, позволяя функциональность Series/PanelSeries(для индекса) /Panel(для элементов) теперь разрешают доступ к элементам через атрибуты (GH 1903)In [109]: s = pd.Series([1, 2, 3], index=list('abc')) In [110]: s.b Out[110]: 2 In [111]: s.a = 5 In [112]: s Out[112]: a 5 b 2 c 3 dtype: int64
Исправления ошибок#
HDFStoreвызов недопустимого
TypeErrorвместоValueErrorпри добавлении с другим порядком блоков (GH 4096)read_hdfне учитывался как переданныйmode(GH 4504)добавление таблицы нулевой длины будет работать корректно (GH 4273)
to_hdfвызывал ошибку при передаче обоих аргументовappendиtable(GH 4584)чтение из хранилища с дублирующимися столбцами разных типов данных вызывало ошибку (GH 4767)
Исправлена ошибка, где
ValueErrorнеправильно вызывалось, когда имена столбцов не были строками (GH 4956)Серия нулевой длины, записанная в формате Fixed, неправильно десериализуется. (GH 4708)
Исправлена проблема с производительностью декодирования на pyt3 (GH 5441)
Проверить уровни в MultiIndex перед сохранением (GH 5527)
Корректно обрабатывать
data_columnsс Panel (GH 5717)
Исправлена ошибка в tslib.tz_convert(vals, tz1, tz2): она могла вызывать исключение IndexError при попытке доступа к trans[pos + 1] (GH 4496)
The
byаргумент теперь корректно работает сlayoutаргумент (GH 4102, GH 4014) в*.histметоды построения графиковИсправлена ошибка в
PeriodIndex.mapгде использованиеstrвернет строковое представление индекса (GH 4136)Исправлен сбой теста
test_time_series_plot_color_with_empty_kwargsпри использовании пользовательских цветов по умолчанию matplotlib (GH 4345)Исправление запуска тестов ввода-вывода Stata. Теперь используются временные файлы для записи (GH 4353)
Исправлена проблема, где
DataFrame.sumбыл медленнее, чемDataFrame.meanдля целочисленных фреймов (GH 4365)read_htmlтесты теперь работают с Python 2.6 (GH 4351)Исправлена ошибка, где
networkтестирование выдавалоNameErrorпотому что локальная переменная была не определена (GH 4381)В
to_json, вызывает ошибку, если переданorientприведёт к потере данных из-за дублирующегося индекса (GH 4359)В
to_json, исправлена обработка дат, чтобы миллисекунды были временной меткой по умолчанию, как указано в документации (GH 4362).as_indexбольше не игнорируется при выполнении groupby apply (GH 4648, GH 3417)Исправлена обработка JSON NaT, NaT теперь сериализуются в
null(GH 4498)Исправлена обработка JSON экранируемых символов в ключах JSON-объектов (GH 4593)
Исправлена передача
keep_default_na=Falseкогдаna_values=None(GH 4318)Исправлена ошибка с
valuesвызывая ошибку в DataFrame с дублирующимися столбцами и смешанными типами данных, обнаруженную в (GH 4377)Исправлена ошибка с дублирующимися столбцами и преобразованием типов в
read_jsonкогдаorient='split'(GH 4377)Исправлена ошибка JSON, где локали с разделителями десятичных знаков, отличными от ‘.’, вызывали исключения при кодировании / декодировании определенных значений. (GH 4918)
Исправление
.iatиндексирование с помощьюPeriodIndex(GH 4390)Исправлена проблема, где
PeriodIndexобъединение с самим собой возвращало новый экземпляр вместо того же экземпляра (GH 4379); также добавляет тест для этого для других типов индексовИсправлена ошибка, при которой все типы данных преобразовывались в object при использовании CSV cparser с параметром usecols (GH 3192)
Исправлена проблема при слиянии блоков, когда результирующий DataFrame имел частично установленные _ref_locs (GH 4403)
Исправлена проблема, при которой гистограммы на подграфиках перезаписывались при их вызове с использованием API верхнего уровня matplotlib (GH 4408)
при попытке доступа к отсутствующему атрибуту (
Series.astype(str)обрезал строку (GH 4405, GH 4437)Исправлена проблема совместимости с py3, где байты представлялись как кортежи (GH 4455)
Исправлен конфликт именования атрибутов Panel, если элемент назван 'a' (GH 3440)
Исправлена проблема, когда дублирующиеся индексы вызывали ошибку при построении графиков (GH 4486)
Исправлена проблема, где cumsum и cumprod не работали с булевыми типами данных (GH 4170, GH 4440)
Исправлена проблема срезов панелей в
xsкоторый возвращал некорректный затемненный объект (GH 4016)Исправлена ошибка ресемплинга, когда пользовательская функция редукции не использовалась, если только одна группа (GH 3849, GH 4494)
Исправлено назначение панели с транспонированным фреймом (GH 3830)
Вызвать исключение при индексировании с помощью Panel и Panel в качестве значения, которое требует выравнивания (GH 3777)
объекты frozenset теперь вызывают ошибку в
Seriesконструктор (GH 4482, GH 4480)Исправлена проблема с сортировкой дублирующегося MultiIndex, имеющего несколько типов данных (GH 4516)
Исправлена ошибка в
DataFrame.set_valuesчто приводило к потере атрибутов имени при расширении индекса. (GH 3742, GH 4039)Исправлена проблема, когда отдельные
names,levelsиlabelsможет быть установлен наMultiIndexбез проверки (pandas.tseries.offsets.CustomBusinessMonthEnd, GH 4039)Исправлено (GH 3334) в pivot_table. Поля итогов не вычислялись, если значения являются индексом.
Исправление ошибки при наличии правой части
np.timedelta64илиnp.offsets.DateOffsetпри работе с датами и временем (GH 4532)Исправление арифметики с series/datetimeindex и
np.timedelta64не работает так же (GH 4134) и ошибочный timedelta в NumPy 1.6 (GH 4135)Исправлена ошибка в
pd.read_clipboardна windows с PY3 (GH 4561); не декодируется правильноtslib.get_period_field()иtslib.get_period_field_arr()теперь вызывает исключение если аргумент кода вне диапазона (GH 4519, GH 4520)Исправлено: булева индексация на пустой серии теряет имена индексов (GH 4235), функция infer_dtype работает с пустыми массивами.
Исправление переиндексации с несколькими осями; если совпадение осей не заменяло текущие оси, что приводило к возможной проблеме ленивого вывода частоты (GH 3317)
Исправлена проблема, когда
DataFrame.applyнеправильно перевыбрасывал исключения (приводя к усечению исходной трассировки стека).Исправлен выбор с
ix/locи селекторы non_unique (GH 4619)Исправлено присваивание с iloc/loc, связанное с изменением типа данных в существующем столбце (GH 4312, GH 5702) имеют внутренний setitem_with_indexer в core/indexing для использования Block.setitem
Исправлена ошибка, при которой оператор тысяч не обрабатывался корректно для чисел с плавающей точкой при импорте csv (GH 4322)
Исправлена проблема с CacheableOffset, который неправильно использовался многими DateOffset; это мешало кэшированию DateOffset (GH 4609)
Исправлено логическое сравнение с DataFrame слева и списком/кортежем справа (GH 4576)
Исправлена ошибка/преобразование типа данных при setitem для
NoneнаSeries/DataFrame(GH 4667)Исправлено декодирование на основе переданной нестандартной кодировки в
pd.read_stata(GH 4626)Исправление
DataFrame.from_recordsс простымndarray. (GH 4727)Исправлены некоторые несоответствия с
Index.renameиMultiIndex.rename, и т.д. (GH 4718, GH 4628)Ошибка при использовании
iloc/locс перекрёстными и дублирующимися индексами (GH 4726)Ошибка при использовании
QUOTE_NONEсto_csvвызываяException. (GH 4328)Ошибка с индексацией Series, не вызывающая ошибку, когда правая часть имеет неправильную длину (GH 2702)
Ошибка в MultiIndexing с частичным строковым выбором как частью MultiIndex (GH 4758)
Ошибка с переиндексацией по индексу с неуникальным индексом теперь вызовет
ValueError(GH 4746)Ошибка при установке с
loc/ixодин индексатор с осью MultiIndex и массивом NumPy, связанный с (GH 3777)Ошибка в конкатенации с дублирующимися столбцами между разными dtypes, не объединяющимися с axis=0 (GH 4771, GH 4975)
Ошибка в
ilocпри срезе индекса возникает ошибка (GH 4771)Некорректное сообщение об ошибке без colspecs или width в
read_fwf. (GH 4774)Исправлены ошибки индексации в Series с дублирующимся индексом (GH 4548, GH 4550)
Исправлена ошибка при чтении сжатых файлов с
read_fwfв Python 3. (GH 3963)Исправлена проблема с дублирующимся индексом и присваиванием с изменением типа данных (GH 4686)
Исправлена ошибка при чтении сжатых файлов в
bytesвместоstrв Python 3. Упрощает работу с файлами, производящими байты, в Python 3 (GH 3963, GH 4785).Исправлена проблема, связанная с ticklocs/ticklabels для столбчатых диаграмм с логарифмической шкалой в разных версиях matplotlib (GH 4789)
Подавлено DeprecationWarning, связанное с внутренними вызовами, выдаваемыми repr() (GH 4391)
Исправлена проблема с дублирующимся индексом и дублирующимся селектором в
.loc(GH 4825)Исправлена проблема с
DataFrame.sort_indexгде, при сортировке по одному столбцу и передаче списка дляascending, аргумент дляascendingинтерпретировался какTrue(GH 4839, GH 4846)Исправлено
Panel.tshiftне работает. Добавленоfreqподдержка дляPanel.shift(GH 4853)Исправлена проблема в TextFileReader с движком Python (т.е. PythonParser) при thousands != "," (GH 4596)
Ошибка в getitem с дублирующимся индексом при использовании where (GH 4879)
Исправление: код вывода типов преобразует столбец с плавающей точкой в дату и время (GH 4601)
Исправлено
_ensure_numericне проверяет наличие комплексных чисел (GH 4902)Исправлена ошибка в
Series.histгде создавались две фигуры, когдаbyаргумент был передан (GH 4112, GH 4113).Исправлена ошибка в
convert_objectsдля > 2 измерений (GH 4937)Исправлена ошибка во вставке в кэш DataFrame/Panel и последующем индексировании (GH 4939, GH 5424)
Исправлены строковые методы для
FrozenNDArrayиFrozenList(GH 4929)Исправлена ошибка при установке недопустимых или выходящих за пределы значений в сценариях увеличения индексации (GH 4940)
Тесты для fillna на пустом Series (GH 4346), спасибо @immerrr
Исправлено
copy()поверхностно копировать оси/индексы и тем самым сохранять отдельные метаданные. (GH 4202, GH 4830)Исправлена опция skiprows в Python парсере для read_csv (GH 4382)
Исправлена ошибка, препятствующая
cutпри работе сnp.infуровни без явной передачи меток (GH 3415)Исправлена неправильная проверка перекрытия в
DatetimeIndex.union(GH 4564)Исправлен конфликт между разделителем тысяч и парсером дат в csv_parser (GH 4678)
Исправлено добавление, когда типы данных не совпадают (ошибка, показывающая смешение float/np.datetime64) (GH 4993)
Исправлено repr для DateOffset. Больше не показывает дублирующиеся записи в kwds. Удалены неиспользуемые поля смещения. (GH 4638)
Исправлено неправильное имя индекса при read_csv, если используется usecols. Применяется только к парсеру c (GH 4201)
Timestampобъекты теперь могут появляться в левой части операции сравнения сSeriesилиDataFrameобъект (GH 4982).Исправлена ошибка при индексации с
np.nanчерезiloc/loc(GH 5016)Исправлена ошибка, при которой парсер с низким потреблением памяти мог создавать разные типы в разных частях одного файла. Теперь приводит к числовому типу или выдает предупреждение. (GH 3866)
Исправлена ошибка, при которой изменение формы
Seriesв свою собственную форму возведенTypeError(GH 4554) и другие проблемы с преобразованием формы.Ошибка при установке с
ix/locи смешанный индекс int/string (GH 4544)Убедитесь, что булевы сравнения series-series основаны на метках (GH 4947)
Ошибка в многоуровневом индексировании с частичным индексатором Timestamp (GH 4294)
Тесты/исправление для построения MultiIndex из полностью NaN фрейма (GH 4078)
Исправлена ошибка, где
read_html()неправильно определял значения таблиц с запятыми (GH 5029)Исправлена ошибка, где
read_html()не обеспечивал стабильный порядок возвращаемых таблиц (GH 4770, GH 5029).Исправлена ошибка, где
read_html()некорректно парсился при передачеindex_col=0(GH 5066).Исправлена ошибка, где
read_html()неправильно определял тип заголовков (GH 5048).Исправлена ошибка, где
DatetimeIndexобъединения сPeriodIndexвызвало переполнение стека (GH 3899).Исправлена ошибка, где
groupbyобъекты не позволяли строить графики (GH 5102).Исправлена ошибка, где
groupbyобъекты не поддерживали автодополнение имён столбцов (GH 5102).Исправлена ошибка, где
groupby.plot()и аналогичные функции дублировали графики несколько раз (GH 5102).Обеспечить автоматическое преобразование
objectтипы данных при fillna, связанные (GH 5103)Исправлена ошибка, когда параметры по умолчанию перезаписывались при очистке парсера опций (GH 5121).
Обрабатывать список/ndarray одинаково для
ilocиндексация с помощью подобного списку (GH 5006)Исправление
MultiIndex.get_level_values()с пропущенными значениями (GH 5074)Исправление проверки границ для Timestamp() с входными данными datetime64 (GH 4065)
Исправлена ошибка, где
TestReadHtmlне вызывал правильныйread_html()функция (GH 5150).Исправлена ошибка с
NDFrame.replace()что делало замену похожей на (неправильное) использование регулярных выражений (GH 5143).Исправлено: лучшее сообщение об ошибке для to_datetime (GH 4928)
Убедились, что разные локали тестируются на travis-ci (GH 4918). Также добавляет несколько утилит для получения локалей и установки локалей с помощью контекстного менеджера.
Исправлен сбой сегментации на
isnull(MultiIndex)(теперь вызывает ошибку вместо этого) (NaN, GH 5125)Разрешить дублирующиеся индексы при выполнении операций, которые выравнивают (GH 5185, GH 5639)
Составные типы данных в конструкторе вызывают
NotImplementedError(GH 5191)Ошибка при сравнении дублирующихся фреймов (GH 4421) связанный
Ошибка в describe на дублирующихся фреймах
Ошибка в
to_datetimeс форматом иcoerce=Trueне вызывает исключение (GH 5195)Ошибка в
locустановка с несколькими индексаторами и правой частью Series, которая требует широковещания (GH 5206)Исправлена ошибка, при которой установка уровней или меток на месте в
MultiIndexне очистит кэшированныеvaluesсвойство и поэтому возвращают неверноеvalues. (-nan)Исправлена ошибка, при которой фильтрация сгруппированного DataFrame или Series не сохраняла исходный порядок (GH 4621).
Исправлено
Periodс бизнес-частотой даты для постоянного продвижения вперед, если на нерабочей дате. (GH 5203)Исправлена ошибка в модулях записи Excel, где фреймы с повторяющимися именами столбцов не записывались корректно. (GH 5235)
Исправлена проблема с
dropи не уникальный индекс на Series (GH 5248)Исправлен сегфолт в C-парсере, вызванный передачей большего количества имен, чем столбцов в файле. (GH 5156)
Исправление
Series.isinс типами данных, похожими на дату/время (GH 5021)Парсеры C и Python теперь могут обрабатывать более распространенный формат столбцов MultiIndex, который не имеет строки для имен индексов (GH 4702)
Ошибка при попытке использовать дату вне диапазона как тип данных object (GH 5312)
Ошибка при попытке отобразить встроенный PandasObject (GH 5324)
Позволяет операциям с Timestamps возвращать datetime, если результат выходит за пределы допустимого диапазона связано (GH 5312)
Исправление возвращаемого значения/сигнатуры типа для
initObjToJSON()чтобы быть совместимым с numpyimport_array()(GH 5334, GH 5326)Ошибка при переименовании, затем set_index на DataFrame (GH 5344)
Тестовый набор больше не оставляет временные файлы при тестировании графиков. (GH 5347) (спасибо, что заметили это @yarikoptic!)
Исправлены html-тесты на win32. (GH 4580)
Убедитесь, что
head/tailявляютсяilocоснованный, (GH 5370)Исправлена ошибка для
PeriodIndexстроковое представление, если есть 1 или 2 элемента. (GH 5372)Методы GroupBy
transformиfilterможет использоваться на Series и DataFrames с повторяющимися (неуникальными) индексами. (GH 4620)Исправлено: пустая серия не выводит имя в repr (GH 4651)
Сделать тесты создающими временные файлы во временном каталоге по умолчанию. (GH 5419)
pd.to_timedeltaскаляра возвращает скаляр (GH 5410)pd.to_timedeltaпринимаетNaNиNaT, возвращаяNaTвместо вызова исключения (GH 5437)улучшения производительности в
isnullна объектах pandas большего размераИсправлены различные setitem с 1d ndarray, которые не имеют соответствующей длины индексатору (GH 5508)
Ошибка в getitem с MultiIndex и
iloc(GH 5528)Ошибка в delitem для Series (GH 5542)
Исправление ошибки в apply при использовании пользовательской функции и неизменяемых объектов (GH 5545)
Ошибка при выборе из неуникального индекса с
loc(GH 5553)Ошибка в groupby, возвращающая несовместимые типы, когда пользовательская функция возвращает
None, (GH 5592)Обход регрессии в numpy 1.7.0, которая ошибочно вызывает IndexError из
ndarray.item(GH 5666)Ошибка при повторном индексировании объекта с результирующим неуникальным индексом (GH 5678)
Ошибка в fillna с Series и переданным series/dict (GH 5703)
Ошибка в groupby transform с группировщиком типа datetime (GH 5712)
Ошибка в выборе MultiIndex в PY3 при использовании определенных ключей (GH 5725)
Построчное объединение различных типов данных, которое не работает в некоторых случаях (GH 5754)
Участники#
Всего 77 человек внесли патчи в этот релиз. Люди с «+» рядом с именами внесли патч впервые.
Agustín Herranz +
Alex Gaudio +
Alex Rothberg +
Andreas Klostermann +
Andreas Würl +
Andy Hayden
Ben Alex +
Benedikt Sauer +
Брэд Буран
Caleb Epstein +
Chang She
Кристофер Уилан
DSM +
Dale Jung +
Dan Birken
David Rasch +
Dieter Vandenbussche
Gabi Davar +
Garrett Drapala
Goyo +
Greg Reda +
Иван Смирнов +
Jack Kelly +
Jacob Schaer +
Jan Schulz +
Jeff Tratner
Джеффри Тратнер
John McNamara +
John W. O’Brien +
Joris Van den Bossche
Justin Bozonier +
Келси Джордал
Кевин Стоун
Kieran O’Mahony
Kyle Hausmann +
Kyle Kelley +
Кайл Мейер
Mike Kelly
Mortada Mehyar +
Nick Foti +
Olivier Harris +
Ondřej Čertík +
PKEuS
Филлип Клауд
Пьер Хессиг +
Richard T. Guy +
Roman Pekar +
Roy Hyunjin Han
Skipper Seabold
Sten +
Thomas A Caswell +
Томас Клуйвер
Тьяго Рекейхо +
TomAugspurger
Trent Hauck
Valentin Haenel +
Виктор Керкез +
Vincent Arel-Bundock
Wes McKinney
Wes Turner +
Weston Renoud +
Yaroslav Halchenko
Zach Dwiel +
chapman siu +
chappers +
d10genes +
danielballan
daydreamt +
engstrom +
jreback
monicaBee +
prossahl +
rockg +
unutbu +
westurner +
y-p
zach powers