Что нового в версии 1.4.0 (22 января 2022 г.)#

Это изменения в pandas 1.4.0. См. Примечания к выпуску для полного списка изменений, включая другие версии pandas.

Улучшения#

Улучшенные предупреждающие сообщения#

Ранее предупреждающие сообщения могли указывать на строки внутри библиотеки pandas. Запуск скрипта setting_with_copy_warning.py

import pandas as pd

df = pd.DataFrame({'a': [1, 2, 3]})
df[:2].loc[:, 'a'] = 5

с pandas 1.3 привело к:

.../site-packages/pandas/core/indexing.py:1951: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.

Это затрудняло определение источника предупреждения. Теперь pandas будет проверять стек вызовов, сообщая о первой строке вне библиотеки pandas, которая вызвала предупреждение. Вывод приведённого скрипта теперь:

setting_with_copy_warning.py:4: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.

Index может содержать произвольные ExtensionArrays#

До сих пор передача пользовательского ExtensionArray to pd.Index приведёт к преобразованию массива в object dtype. Теперь Index может напрямую содержать произвольные ExtensionArrays (GH 43930).

Предыдущее поведение:

In [1]: arr = pd.array([1, 2, pd.NA])

In [2]: idx = pd.Index(arr)

В старом поведении, idx будет типа object:

Предыдущее поведение:

In [1]: idx
Out[1]: Index([1, 2, ], dtype='object')

С новым поведением мы сохраняем исходный dtype:

Новое поведение:

In [3]: idx
Out[3]: Index([1, 2, ], dtype='Int64')

Одно исключение из этого правила SparseArray, который будет продолжать приводить к numpy dtype до pandas 2.0. В этот момент он сохранит свой dtype, как другие ExtensionArrays.

Styler#

Styler был дополнительно развит в версии 1.4.0. Были внесены следующие общие улучшения:

  • Добавлено стилизация и форматирование индексов, с Styler.apply_index(), Styler.applymap_index() и Styler.format_index(). Они отражают сигнатуру методов, уже используемых для стилизации и форматирования значений данных, и работают с форматами HTML, LaTeX и Excel (GH 41893, GH 43101, GH 41993, GH 41995)

  • Новый метод Styler.hide() устаревает Styler.hide_index() и Styler.hide_columns() (GH 43758)

  • Ключевые аргументы level и names были добавлены в Styler.hide() (и неявно для устаревших методов Styler.hide_index() и Styler.hide_columns()) для дополнительного контроля видимости MultiIndex и имен индексов (GH 25475, GH 43404, GH 43346)

  • The Styler.export() и Styler.use() были обновлены для поддержки всей добавленной функциональности из версий v1.2.0 и v1.3.0 (GH 40675)

  • Глобальные опции в категории pd.options.styler были расширены для настройки значений по умолчанию Styler свойства, которые касаются форматирования, кодирования и рендеринга HTML и LaTeX. Обратите внимание, что ранее Styler полагался на display.html.use_mathjax, который теперь был заменен на styler.html.mathjax (GH 41395)

  • Проверка определенных ключевых аргументов, например, caption (GH 43368)

  • Различные исправления ошибок, как указано ниже

Кроме того, есть конкретные улучшения для рендеринга, специфичного для HTML:

  • Styler.bar() вводит дополнительные аргументы для управления выравниванием и отображением (GH 26070, GH 36419), а также проверяет входные аргументы width и height (GH 42511)

  • Styler.to_html() вводит аргументы ключевых слов sparse_index, sparse_columns, bold_headers, caption, max_rows и max_columns (GH 41946, GH 43149, GH 42972)

  • Styler.to_html() опускает правила CSSStyle для скрытых элементов таблицы в качестве улучшения производительности (GH 43619)

  • Пользовательские CSS-классы теперь можно указывать напрямую без замены строк (GH 43686)

  • Возможность автоматически отображать гиперссылки через новый hyperlinks ключевой аргумент форматирования (GH 45058)

Также есть некоторые улучшения, специфичные для LaTeX:

  • Styler.to_latex() вводит аргумент ключевого слова environment, который также позволяет использовать конкретную запись «longtable» через отдельный шаблон jinja2 (GH 41866)

  • Наивная разреженность теперь возможна для LaTeX без необходимости включения пакета multirow (GH 43369)

  • cline добавлена поддержка для MultiIndex разрежение строк через аргумент ключевого слова (GH 45138)

Многопоточное чтение CSV с новым движком CSV на основе pyarrow#

pandas.read_csv() теперь принимает engine="pyarrow" (требуется как минимум pyarrow 1.0.1) в качестве аргумента, что позволяет ускорить парсинг csv на многоядерных системах с установленным pyarrow. См. Документация по вводу/выводу для получения дополнительной информации. (GH 23697, GH 43706)

Функция ранжирования для скользящих и расширяющихся окон#

Добавлен rank функция для Rolling и Expanding. Новая функция поддерживает method, ascending, и pct флаги DataFrame.rank(). method аргумент поддерживает min, max, и average методы ранжирования. Пример:

In [4]: s = pd.Series([1, 4, 2, 3, 5, 3])

In [5]: s.rolling(3).rank()
Out[5]: 
0    NaN
1    NaN
2    2.0
3    2.0
4    3.0
5    1.5
dtype: float64

In [6]: s.rolling(3).rank(method="max")
Out[6]: 
0    NaN
1    NaN
2    2.0
3    2.0
4    3.0
5    2.0
dtype: float64

Позиционное индексирование группировки#

Теперь можно указывать позиционные диапазоны относительно концов каждой группы.

Отрицательные аргументы для DataFrameGroupBy.head(), SeriesGroupBy.head(), DataFrameGroupBy.tail(), и SeriesGroupBy.tail() теперь работают корректно и дают диапазоны относительно конца и начала каждой группы соответственно. Ранее отрицательные аргументы возвращали пустые фреймы.

In [7]: df = pd.DataFrame([["g", "g0"], ["g", "g1"], ["g", "g2"], ["g", "g3"],
   ...:                    ["h", "h0"], ["h", "h1"]], columns=["A", "B"])
   ...: 

In [8]: df.groupby("A").head(-1)
Out[8]: 
   A   B
0  g  g0
1  g  g1
2  g  g2
4  h  h0

DataFrameGroupBy.nth() и SeriesGroupBy.nth() теперь принимает срез или список целых чисел и срезов.

In [9]: df.groupby("A").nth(slice(1, -1))
Out[9]: 
   A   B
1  g  g1
2  g  g2

In [10]: df.groupby("A").nth([slice(None, 1), slice(-1, None)])
Out[10]: 
   A   B
0  g  g0
3  g  g3
4  h  h0
5  h  h1

DataFrameGroupBy.nth() и SeriesGroupBy.nth() теперь принимают индексную нотацию.

In [11]: df.groupby("A").nth[1, -1]
Out[11]: 
   A   B
1  g  g1
3  g  g3
5  h  h1

In [12]: df.groupby("A").nth[1:-1]
Out[12]: 
   A   B
1  g  g1
2  g  g2

In [13]: df.groupby("A").nth[:1, -1:]
Out[13]: 
   A   B
0  g  g0
3  g  g3
4  h  h0
5  h  h1

DataFrame.from_dict и DataFrame.to_dict имеют новые 'tight' опция#

Новый 'tight' формат словаря, который сохраняет MultiIndex записи и имена теперь доступны с DataFrame.from_dict() и DataFrame.to_dict() методы и могут использоваться со стандартными json библиотека для создания компактного представления DataFrame объекты (GH 4889).

In [14]: df = pd.DataFrame.from_records(
   ....:     [[1, 3], [2, 4]],
   ....:     index=pd.MultiIndex.from_tuples([("a", "b"), ("a", "c")],
   ....:                                     names=["n1", "n2"]),
   ....:     columns=pd.MultiIndex.from_tuples([("x", 1), ("y", 2)],
   ....:                                       names=["z1", "z2"]),
   ....: )
   ....: 

In [15]: df
Out[15]: 
z1     x  y
z2     1  2
n1 n2      
a  b   1  3
   c   2  4

In [16]: df.to_dict(orient='tight')
Out[16]: 
{'index': [('a', 'b'), ('a', 'c')],
 'columns': [('x', 1), ('y', 2)],
 'data': [[1, 3], [2, 4]],
 'index_names': ['n1', 'n2'],
 'column_names': ['z1', 'z2']}

Другие улучшения#

Значительные исправления ошибок#

Это исправления ошибок, которые могут привести к заметным изменениям в поведении.

Несогласованный разбор строк дат#

The dayfirst опция to_datetime() не строгий, и это может привести к неожиданному поведению:

In [17]: pd.to_datetime(["31-12-2021"], dayfirst=False)
Out[17]: DatetimeIndex(['2021-12-31'], dtype='datetime64[ns]', freq=None)

Теперь будет выдаваться предупреждение, если строку даты невозможно разобрать в соответствии с заданным dayfirst значение, когда значение является строкой даты с разделителями (например, 31-12-2012).

Игнорирование типов данных в concat с пустыми или полностью NA-столбцами#

Примечание

Это изменение поведения было отменено в pandas 1.4.3.

При использовании concat() объединить два или более DataFrame объектами, иногда игнорируются при определении объединённого типа данных. Теперь они последовательно не игнорировался (GH 43507).

In [3]: df1 = pd.DataFrame({"bar": [pd.Timestamp("2013-01-01")]}, index=range(1))
In [4]: df2 = pd.DataFrame({"bar": np.nan}, index=range(1, 2))
In [5]: res = pd.concat([df1, df2])

Ранее тип данных float в df2 будут проигнорированы, поэтому результирующий dtype будет datetime64[ns]. В результате, np.nan будет приведено к NaT.

Предыдущее поведение:

In [6]: res
Out[6]:
         bar
0 2013-01-01
1        NaT

Теперь тип данных float учитывается. Поскольку общий тип данных для этих DataFrame - object, то np.nan сохраняется.

Новое поведение:

In [6]: res
Out[6]:
                   bar
0  2013-01-01 00:00:00
1                  NaN

Нулевые значения больше не приводятся к NaN-значениям в value_counts и mode#

Series.value_counts() и Series.mode() больше не приводит к принудительному преобразованию None, NaT и другие нулевые значения в значение NaN для np.object_-dtype. Это поведение теперь согласовано с unique, isin и другие (GH 42688).

In [18]: s = pd.Series([True, None, pd.NaT, None, pd.NaT, None])

In [19]: res = s.value_counts(dropna=False)

Ранее все нулевые значения заменялись значением NaN.

Предыдущее поведение:

In [3]: res
Out[3]:
NaN     5
True    1
dtype: int64

Теперь нулевые значения больше не искажаются.

Новое поведение:

In [20]: res
Out[20]: 
None    3
NaT     2
True    1
Name: count, dtype: int64

Параметр mangle_dupe_cols в read_csv больше не переименовывает уникальные столбцы, конфликтующие с целевыми именами#

read_csv() больше не переименовывает уникальные метки столбцов, которые конфликтуют с целевыми именами дублированных столбцов. Уже существующие столбцы пропускаются, т.е. следующий доступный индекс используется для имени целевого столбца (GH 14704).

In [21]: import io

In [22]: data = "a,a,a.1\n1,2,3"

In [23]: res = pd.read_csv(io.StringIO(data))

Ранее второй столбец назывался a.1, в то время как третий столбец был также переименован в a.1.1.

Предыдущее поведение:

In [3]: res
Out[3]:
    a  a.1  a.1.1
0   1    2      3

Теперь переименование проверяет, если a.1 уже существует при изменении имени второго столбца и пропускает этот индекс. Второй столбец вместо этого переименовывается в a.2.

Новое поведение:

In [24]: res
Out[24]: 
   a  a.2  a.1
0  1    2    3

unstack и pivot_table больше не вызывают ValueError для результата, который превысил бы предел int32#

Ранее DataFrame.pivot_table() и DataFrame.unstack() будет вызывать ValueError если операция может дать результат с более чем 2**31 - 1 элементы. Эта операция теперь вызывает errors.PerformanceWarning вместо (GH 26314).

Предыдущее поведение:

In [3]: df = DataFrame({"ind1": np.arange(2 ** 16), "ind2": np.arange(2 ** 16), "count": 0})
In [4]: df.pivot_table(index="ind1", columns="ind2", values="count", aggfunc="count")
ValueError: Unstacked DataFrame is too big, causing int32 overflow

Новое поведение:

In [4]: df.pivot_table(index="ind1", columns="ind2", values="count", aggfunc="count")
PerformanceWarning: The following operation may generate 4294967296 cells in the resulting pandas object.

groupby.apply: последовательное обнаружение преобразования#

DataFrameGroupBy.apply() и SeriesGroupBy.apply() разработаны для гибкости, позволяя пользователям выполнять агрегации, преобразования, фильтрации и использовать их с пользовательскими функциями, которые могут не подпадать ни под одну из этих категорий. В рамках этого apply будет пытаться определить, когда операция является преобразованием, и в таком случае результат будет иметь тот же индекс, что и входные данные. Чтобы определить, является ли операция преобразованием, pandas сравнивает индекс входных данных с индексом результата и определяет, был ли он изменён. Ранее в pandas 1.3 разные пути кода использовали разные определения «изменённого»: некоторые использовали Python is в то время как другие проверяли бы только до равенства.

Эта несогласованность была устранена, pandas теперь проверяет на равенство.

In [25]: def func(x):
   ....:     return x.copy()
   ....: 

In [26]: df = pd.DataFrame({'a': [1, 2], 'b': [3, 4], 'c': [5, 6]})

In [27]: df
Out[27]: 
   a  b  c
0  1  3  5
1  2  4  6

Предыдущее поведение:

In [3]: df.groupby(['a']).apply(func)
Out[3]:
     a  b  c
a
1 0  1  3  5
2 1  2  4  6

In [4]: df.set_index(['a', 'b']).groupby(['a']).apply(func)
Out[4]:
     c
a b
1 3  5
2 4  6

В примерах выше, первый использует путь кода, где pandas использует is и определяет, что func не является преобразованием, тогда как второй тест проверяет до равенства и определяет, что func является преобразованием. В первом случае индекс результата не совпадает с индексом входных данных.

Новое поведение:

In [5]: df.groupby(['a']).apply(func)
Out[5]:
   a  b  c
0  1  3  5
1  2  4  6

In [6]: df.set_index(['a', 'b']).groupby(['a']).apply(func)
Out[6]:
     c
a b
1 3  5
2 4  6

Теперь в обоих случаях определяется, что func является преобразованием. В каждом случае результат имеет тот же индекс, что и входные данные.

Обратно несовместимые изменения API#

Повышена минимальная версия Python#

pandas 1.4.0 поддерживает Python 3.8 и выше.

Повышенные минимальные версии для зависимостей#

Некоторые минимальные поддерживаемые версии зависимостей были обновлены. Если установлены, теперь требуются:

Пакет

Минимальная версия

Обязательно

Изменено

numpy

1.18.5

X

X

pytz

2020.1

X

X

python-dateutil

2.8.1

X

X

bottleneck

1.3.1

X

numexpr

2.7.1

X

pytest (разработка)

6.0

mypy (dev)

0.930

X

Для дополнительные библиотеки общая рекомендация — использовать последнюю версию. В следующей таблице перечислены минимальные версии библиотек, которые в настоящее время тестируются в процессе разработки pandas. Опциональные библиотеки ниже минимальной тестируемой версии могут всё ещё работать, но не считаются поддерживаемыми.

Пакет

Минимальная версия

Изменено

beautifulsoup4

4.8.2

X

fastparquet

0.4.0

fsspec

0.7.4

gcsfs

0.6.0

lxml

4.5.0

X

matplotlib

3.3.2

X

numba

0.50.1

X

openpyxl

3.0.3

X

pandas-gbq

0.14.0

X

pyarrow

1.0.1

X

pymysql

0.10.1

X

pytables

3.6.1

X

s3fs

0.4.0

scipy

1.4.1

X

sqlalchemy

1.4.0

X

tabulate

0.8.7

xarray

0.15.1

X

xlrd

2.0.1

X

xlsxwriter

1.2.2

X

xlwt

1.3.0

См. Зависимости и Необязательные зависимости подробнее.

Другие изменения API#

  • Index.get_indexer_for() больше не принимает аргументы ключевых слов (кроме target); в прошлом они молча игнорировались, если индекс не был уникальным (GH 42310)

  • Изменение позиции min_rows аргумент в DataFrame.to_string() из-за изменения в строке документации (GH 44304)

  • Операции редукции для DataFrame или Series теперь вызывает исключение ValueError когда None передается для skipna (GH 44178)

  • read_csv() и read_html() больше не вызывает ошибку, когда одна из строк заголовка состоит только из Unnamed: столбцы (GH 13054)

  • Изменен name атрибут нескольких праздников в USFederalHolidayCalendar для соответствия официальные названия федеральных праздников конкретно:

    • “New Year’s Day” получает апостроф притяжательного падежа

    • “Presidents Day” становится “Washington’s Birthday”

    • “День Мартина Лютера Кинга-младшего” теперь “День рождения Мартина Лютера Кинга-младшего”

    • “4 июля” теперь “День независимости”

    • “Thanksgiving” теперь “Thanksgiving Day”

    • «Рождество» теперь «Рождественский день»

    • Добавлен "День независимости Джунита"

Устаревшие функции#

Устаревшие Int64Index, UInt64Index & Float64Index#

Int64Index, UInt64Index и Float64Index были устаревшими в пользу базового Index класс и будет удален в Pandas 2.0 (GH 43028).

Для построения числового индекса можно использовать базовый Index класс вместо указания типа данных (что также будет работать в старых версиях pandas):

# replace
pd.Int64Index([1, 2, 3])
# with
pd.Index([1, 2, 3], dtype="int64")

Для проверки типа данных объекта индекса, вы можете заменить isinstance проверки с проверкой dtype:

# replace
isinstance(idx, pd.Int64Index)
# with
idx.dtype == "int64"

В настоящее время, для сохранения обратной совместимости, вызовы к Index продолжит возвращать Int64Index, UInt64Index и Float64Index при задании числовых данных, но в будущем Index будет возвращен.

Текущее поведение:

In [1]: pd.Index([1, 2, 3], dtype="int32")
Out [1]: Int64Index([1, 2, 3], dtype='int64')
In [1]: pd.Index([1, 2, 3], dtype="uint64")
Out [1]: UInt64Index([1, 2, 3], dtype='uint64')

Будущее поведение:

In [3]: pd.Index([1, 2, 3], dtype="int32")
Out [3]: Index([1, 2, 3], dtype='int32')
In [4]: pd.Index([1, 2, 3], dtype="uint64")
Out [4]: Index([1, 2, 3], dtype='uint64')

Устаревшие DataFrame.append и Series.append#

DataFrame.append() и Series.append() были устаревшими и будут удалены в будущей версии. Используйте pandas.concat() вместо (GH 35407).

Устаревший синтаксис

In [1]: pd.Series([1, 2]).append(pd.Series([3, 4])
Out [1]:
:1: FutureWarning: The series.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.
0    1
1    2
0    3
1    4
dtype: int64

In [2]: df1 = pd.DataFrame([[1, 2], [3, 4]], columns=list('AB'))
In [3]: df2 = pd.DataFrame([[5, 6], [7, 8]], columns=list('AB'))
In [4]: df1.append(df2)
Out [4]:
:1: FutureWarning: The series.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.
   A  B
0  1  2
1  3  4
0  5  6
1  7  8

Рекомендуемый синтаксис

In [28]: pd.concat([pd.Series([1, 2]), pd.Series([3, 4])])
Out[28]: 
0    1
1    2
0    3
1    4
dtype: int64

In [29]: df1 = pd.DataFrame([[1, 2], [3, 4]], columns=list('AB'))

In [30]: df2 = pd.DataFrame([[5, 6], [7, 8]], columns=list('AB'))

In [31]: pd.concat([df1, df2])
Out[31]: 
   A  B
0  1  2
1  3  4
0  5  6
1  7  8

Другие устаревшие функции#

  • Устаревший Index.is_type_compatible() (GH 42113)

  • Устаревший method аргумент в Index.get_loc(), используйте index.get_indexer([label], method=...) вместо (GH 42269)

  • Устаревшая обработка целочисленных ключей в Series.__setitem__() как позиционный, когда индекс является Float64Index не содержащий ключ, IntervalIndex без записей, содержащих ключ, или MultiIndex с ведущим Float64Index уровень, не содержащий ключ (GH 33469)

  • Устаревшая обработка numpy.datetime64 объекты как времена UTC при передаче в Timestamp конструктор вместе с часовым поясом. В будущей версии они будут рассматриваться как wall-times. Чтобы сохранить старое поведение, используйте Timestamp(dt64).tz_localize("UTC").tz_convert(tz) (GH 24559)

  • Устаревшее игнорирование отсутствующих меток при индексации с помощью последовательности меток на уровне MultiIndex (GH 42351)

  • Создание пустого Series без dtype теперь будет вызывать более заметное FutureWarning вместо DeprecationWarning (GH 30017)

  • Устарел kind аргумент в Index.get_slice_bound(), Index.slice_indexer(), и Index.slice_locs(); в будущей версии передача kind вызовет (GH 42857)

  • Устаревшее удаление нежелательных столбцов в Rolling, Expanding, и EWM агрегации (GH 42738)

  • Устаревший Index.reindex() с неуникальным Index (GH 42568)

  • Устаревший Styler.render() в пользу Styler.to_html() (GH 42140)

  • Устаревший Styler.hide_index() и Styler.hide_columns() в пользу Styler.hide() (GH 43758)

  • Устаревшая передача строковой метки столбца в times в DataFrame.ewm() (GH 43265)

  • Устарел include_start и include_end аргументы в DataFrame.between_time(); в будущей версии передача include_start или include_end вызовет (GH 40245)

  • Устарел squeeze аргумент для read_csv(), read_table(), и read_excel(). Пользователям следует сжать DataFrame после этого с .squeeze("columns") вместо (GH 43242)

  • Устарел index аргумент для SparseArray создание (GH 23089)

  • Устарел closed аргумент в date_range() и bdate_range() в пользу inclusive аргумент; В будущей версии передача closed вызовет (GH 40245)

  • Устаревший Rolling.validate(), Expanding.validate(), и ExponentialMovingWindow.validate() (GH 43665)

  • Устаревшее тихое удаление столбцов, которые вызывали TypeError в Series.transform и DataFrame.transform при использовании со словарем (GH 43740)

  • Устаревшее тихое удаление столбцов, которые вызывали TypeError, DataError, и некоторые случаи ValueError в Series.aggregate(), DataFrame.aggregate(), Series.groupby.aggregate(), и DataFrame.groupby.aggregate() при использовании со списком (GH 43740)

  • Устаревшее поведение приведения при установке значений с учетом часового пояса в объект с учетом часового пояса Series или DataFrame колонку, когда часовые пояса не совпадают. Ранее это приводило к приведению к типу object. В будущей версии вставляемые значения будут преобразованы к существующему часовому поясу серии или колонки (GH 37605)

  • Устаревшее поведение приведения при передаче элемента с несовпадающим часовым поясом в DatetimeIndex.insert(), DatetimeIndex.putmask(), DatetimeIndex.where() DatetimeIndex.fillna(), Series.mask(), Series.where(), Series.fillna(), Series.shift(), Series.replace(), Series.reindex()DataFrame аналоги столбцов). В прошлом это приводило к объекту dtype. В будущей версии они будут преобразовывать переданный элемент в часовой пояс индекса или серии (GH 37605, GH 44940)

  • Устарел prefix именованный аргумент в read_csv() и read_table(), в будущей версии аргумент будет удален (GH 43396)

  • Устаревшая передача нелогического аргумента в sort в concat() (GH 41518)

  • Передача аргументов как позиционных устарела для read_fwf() кроме filepath_or_buffer (GH 41485)

  • Передача аргументов как позиционных устарела для read_xml() кроме path_or_buffer (GH 45133)

  • Устаревшая передача skipna=None для DataFrame.mad() и Series.mad(), передать skipna=True вместо (GH 44580)

  • Устаревшее поведение to_datetime() со строкой "now" с utc=False; в будущей версии это будет соответствовать Timestamp("now"), что, в свою очередь, соответствует Timestamp.now() возвращая локальное время (GH 18705)

  • Устаревший DateOffset.apply(), используйте offset + other вместо (GH 44522)

  • Устаревший параметр names в Index.copy() (GH 44916)

  • Теперь показывается предупреждение об устаревании для DataFrame.to_latex() указывая, что сигнатура аргументов может измениться и эмулировать больше аргументов для Styler.to_latex() в будущих версиях (GH 44411)

  • Устаревшее поведение concat() между объектами с bool-типом и числовыми типами; в будущей версии они будут приводиться к типу object вместо приведения bool к числовым значениям (GH 39817)

  • Устаревший Categorical.replace(), используйте Series.replace() вместо (GH 44929)

  • Устаревшая передача set или dict в качестве индексатора для DataFrame.loc.__setitem__(), DataFrame.loc.__getitem__(), Series.loc.__setitem__(), Series.loc.__getitem__(), DataFrame.__getitem__(), Series.__getitem__() и Series.__setitem__() (GH 42825)

  • Устаревший Index.__getitem__() с булевым ключом; используйте index.values[key] чтобы получить старое поведение (GH 44051)

  • Устаревшее понижающее преобразование по столбцам в DataFrame.where() с целочисленными типами данных (GH 44597)

  • Устаревший DatetimeIndex.union_many(), используйте DatetimeIndex.union() вместо (GH 44091)

  • Устаревший Groupby.pad() в пользу Groupby.ffill() (GH 33396)

  • Устаревший Groupby.backfill() в пользу Groupby.bfill() (GH 33396)

  • Устаревший Resample.pad() в пользу Resample.ffill() (GH 33396)

  • Устаревший Resample.backfill() в пользу Resample.bfill() (GH 33396)

  • Устаревший numeric_only=None в DataFrame.rank(); в будущей версии numeric_only должен быть либо True или False (по умолчанию) (GH 45036)

  • Устаревшее поведение Timestamp.utcfromtimestamp(), в будущем будет возвращать timezone-aware UTC Timestamp (GH 22451)

  • Устаревший NaT.freq() (GH 45071)

  • Устаревшее поведение Series и DataFrame конструкция при передаче данных с типом float, содержащих NaN и целочисленный тип данных, игнорируя аргумент dtype; в будущей версии это вызовет ошибку (GH 40110)

  • Устаревшее поведение Series.to_frame() и Index.to_frame() игнорировать name аргумент, когда name=None. В настоящее время это означает сохранение существующего имени, но в будущем явная передача name=None установит None в качестве имени столбца в результирующем DataFrame (GH 44212)

Улучшения производительности#

Исправления ошибок#

Категориальный#

  • Ошибка при установке значений, несовместимых с dtype, в Categorical (или Series или DataFrame поддерживаемый Categorical) вызывая ValueError вместо TypeError (GH 41919)

  • Ошибка в Categorical.searchsorted() при передаче значения, несовместимого с типом данных, вызывая KeyError вместо TypeError (GH 41919)

  • Ошибка в Categorical.astype() приведение дат и Timestamp в int для dtype object (GH 44930)

  • Ошибка в Series.where() с CategoricalDtype при передаче значения, несовместимого с типом данных, вызывая ValueError вместо TypeError (GH 41919)

  • Ошибка в Categorical.fillna() при передаче значения, несовместимого с типом данных, вызывая ValueError вместо TypeError (GH 41919)

  • Ошибка в Categorical.fillna() с категорией, похожей на кортеж, вызывающей ValueError вместо TypeError при заполнении некатегориальным кортежем (GH 41919)

Datetimelike#

  • Ошибка в DataFrame конструктор ненужно копирует не-датаподобные 2D объектные массивы (GH 39272)

  • Ошибка в to_datetime() с format и pandas.NA вызывал ValueError (GH 42957)

  • to_datetime() молча менял местами MM/DD/YYYY и DD/MM/YYYY форматы, если заданный dayfirst опция не могла быть соблюдена - теперь в случае строк даты с разделителями (например, 31-12-2012) (GH 12585)

  • Ошибка в date_range() и bdate_range() не возвращают правую границу, когда start = end и установлен закрытым с одной стороны (GH 43394)

  • Ошибка при добавлении и вычитании на месте DatetimeIndex или TimedeltaIndex с DatetimeArray или TimedeltaArray (GH 43904)

  • Ошибка при вызове np.isnan, np.isfinite, или np.isinf на данных с учетом часового пояса DatetimeIndex некорректное возбуждение TypeError (GH 43917)

  • Ошибка при построении Series из строк, похожих на дату-время со смешанными часовыми поясами, некорректно частично определяя значения даты-времени (GH 40111)

  • Ошибка при добавлении Tick объект и np.timedelta64 объект некорректно вызывает исключение вместо возврата Timedelta (GH 44474)

  • np.maximum.reduce и np.minimum.reduce теперь правильно возвращают Timestamp и Timedelta объекты при работе с Series, DataFrame, или Index с datetime64[ns] или timedelta64[ns] тип данных (GH 43923)

  • Ошибка при добавлении np.timedelta64 объект в BusinessDay или CustomBusinessDay объект некорректно вызывал (GH 44532)

  • Ошибка в Index.insert() для вставки np.datetime64, np.timedelta64 или tuple в Index с dtype='object' с отрицательным loc, добавляющим None и замена существующего значения (GH 44509)

  • Ошибка в Timestamp.to_pydatetime() не удалось сохранить fold атрибут (GH 45087)

  • Ошибка в Series.mode() с DatetimeTZDtype некорректно возвращающий временную зону-наивный и PeriodDtype неправильное возникновение (GH 41927)

  • Исправлена регрессия в reindex() вызов ошибки при использовании несовместимого значения заполнения с datetime-подобным типом данных (или не вызов предупреждения об устаревании при использовании datetime.date в качестве значения заполнения) (GH 42921)

  • Ошибка в DateOffset сложение с Timestamp где offset.nanoseconds не будут включены в результат (GH 43968, GH 36589)

  • Ошибка в Timestamp.fromtimestamp() не поддерживает tz аргумент (GH 45083)

  • Ошибка в DataFrame создание из словаря Series с несовпадающими типами индексов иногда вызывает ошибку в зависимости от порядка переданного словаря (GH 44091)

  • Ошибка в Timestamp хэширование во время некоторых переходов на летнее время вызывало ошибку сегментации (GH 33931 и GH 40817)

Timedelta#

  • Ошибка в делении всех-NaT TimeDeltaIndex, Series или DataFrame столбец с массивом типа object, содержащим числа, не удаётся определить результат как тип timedelta64 (GH 39750)

  • Ошибка в целочисленном делении timedelta64[ns] данные со скаляром возвращают некорректные значения (GH 44466)

  • Ошибка в Timedelta теперь правильно учитывает любой вклад наносекунд любого аргумента (GH 43764, GH 45227)

Часовые пояса#

  • Ошибка в to_datetime() с infer_datetime_format=True ошибка при разборе нулевого смещения UTC (Z) правильно (GH 41047)

  • Ошибка в Series.dt.tz_convert() сброс индекса в Series с CategoricalIndex (GH 43080)

  • Ошибка в Timestamp и DatetimeIndex некорректно вызывал TypeError при вычитании двух объектов с часовыми поясами с несовпадающими часовыми поясами (GH 31793)

Числовой#

  • Ошибка при целочисленном делении списка или кортежа целых чисел на Series неправильное возникновение (GH 44674)

  • Ошибка в DataFrame.rank() вызов ValueError с object столбцы и method="first" (GH 41931)

  • Ошибка в DataFrame.rank() обработка пропущенных значений и экстремальных значений как равных (например np.nan и np.inf), приводя к некорректным результатам, когда na_option="bottom" или na_option="top используется (GH 41931)

  • Ошибка в numexpr движок все еще используется, когда опция compute.use_numexpr установлено в False (GH 32556)

  • Ошибка в DataFrame арифметические операции с подклассом, чей _constructor() атрибут является вызываемым объектом, отличным от самого подкласса (GH 43201)

  • Ошибка в арифметических операциях, включающих RangeIndex где результат был бы некорректным name (GH 43962)

  • Ошибка в арифметических операциях, включающих Series где результат может быть некорректным name когда операнды имеют совпадающие NA или совпадающие имена кортежей (GH 44459)

  • Ошибка в делении с IntegerDtype или BooleanDtype массив и скаляр NA некорректно вызывали (GH 44685)

  • Ошибка при умножении Series с FloatingDtype с timedelta-подобным скаляром, некорректно вызывающим исключение (GH 44772)

Преобразование#

  • Ошибка в UInt64Index конструктор при передаче списка, содержащего как положительные целые числа, достаточно малые для приведения к int64, так и целые числа, слишком большие для хранения в int64 (GH 42201)

  • Ошибка в Series конструктор возвращает 0 для пропущенных значений с типом данных int64 и False для dtype bool (GH 43017, GH 43018)

  • Ошибка при построении DataFrame из PandasArray содержащий Series объекты, ведущие себя иначе, чем эквивалентные np.ndarray (GH 43986)

  • Ошибка в IntegerDtype не допускает преобразования из строкового типа данных (GH 25472)

  • Ошибка в to_datetime() с arg:xr.DataArray и unit="ns" указанный вызывает TypeError (GH 44053)

  • Ошибка в DataFrame.convert_dtypes() не возвращает правильный тип, когда подкласс не переопределяет _constructor_sliced() (GH 43201)

  • Ошибка в DataFrame.astype() не распространяется attrs из исходного DataFrame (GH 44414)

  • Ошибка в DataFrame.convert_dtypes() результат теряет columns.names (GH 41435)

  • Ошибка при построении IntegerArray из данных pyarrow не удалось проверить dtypes (GH 44891)

  • Ошибка в Series.astype() не разрешая преобразование из PeriodDtype to datetime64 типа данных, несовместимого с PeriodIndex поведение (GH 45038)

Строки#

  • Ошибка при проверке string[pyarrow] dtype некорректно вызывает ImportError когда pyarrow не установлен (GH 44276)

Interval#

  • Ошибка в Series.where() с IntervalDtype неправильно вызывалось исключение, когда where вызов не должен ничего заменять (GH 44181)

Индексирование#

  • Ошибка в Series.rename() с MultiIndex и level предоставлен (GH 43659)

  • Ошибка в DataFrame.truncate() и Series.truncate() когда объект Index имеет длину больше единицы, но только одно уникальное значение (GH 42365)

  • Ошибка в Series.loc() и DataFrame.loc() с MultiIndex при индексировании кортежем, в котором один из уровней также является кортежем (GH 27591)

  • Ошибка в Series.loc() с MultiIndex чей первый уровень содержит только np.nan значения (GH 42055)

  • Ошибка при индексации на Series или DataFrame с DatetimeIndex при передаче строки тип возвращаемого значения зависел от того, был ли индекс монотонным (GH 24892)

  • Ошибка при индексации на MultiIndex не удаётся удалить скалярные уровни, когда индексатор является кортежем, содержащим строку, похожую на datetime (GH 42476)

  • Ошибка в DataFrame.sort_values() и Series.sort_values() при передаче возрастающего значения, не удалось вызвать исключение или вызвано некорректно ValueError (GH 41634)

  • Ошибка при обновлении значений pandas.Series используя булевый индекс, созданный с помощью pandas.DataFrame.pop() (GH 42530)

  • Ошибка в Index.get_indexer_non_unique() когда индекс содержит несколько np.nan (GH 35392)

  • Ошибка в DataFrame.query() не обрабатывал знак градуса в имени столбца в обратных кавычках, таком как `Temp(°C)`, используемом в выражении для запроса DataFrame (GH 42826)

  • Ошибка в DataFrame.drop() где сообщение об ошибке не показывало отсутствующие метки с запятыми при вызове KeyError (GH 42881)

  • Ошибка в DataFrame.query() где вызовы методов в строках запроса приводили к ошибкам, когда numexpr пакет был установлен (GH 22435)

  • Ошибка в DataFrame.nlargest() и Series.nlargest() где отсортированный результат не учитывал индексы, содержащие np.nan (GH 28984)

  • Ошибка при индексации не уникального объекта типа object-dtype Index со скаляром NA (например, np.nan) (GH 43711)

  • Ошибка в DataFrame.__setitem__() некорректная запись в существующий массив столбца вместо установки нового массива, когда новый тип данных и старый тип данных совпадают (GH 43406)

  • Ошибка при установке значений с плавающей точкой в Series с целочисленным типом данных, не удаётся установить на месте, когда эти значения могут быть преобразованы в целые числа без потерь (GH 44316)

  • Ошибка в Series.__setitem__() с object dtype при установке массива с соответствующим размером и dtype='datetime64[ns]' или dtype='timedelta64[ns]' некорректно преобразовывал даты/временные интервалы в целые числа (GH 43868)

  • Ошибка в DataFrame.sort_index() где ignore_index=True не соблюдался, когда индекс уже был отсортирован (GH 43591)

  • Ошибка в Index.get_indexer_non_unique() когда индекс содержит несколько np.datetime64("NaT") и np.timedelta64("NaT") (GH 43869)

  • Ошибка при установке скалярного значения Interval значение в Series с IntervalDtype когда стороны скаляра являются числами с плавающей точкой, а стороны значений - целыми числами (GH 44201)

  • Ошибка при установке строковых Categorical значения, которые можно преобразовать в даты и время, в DatetimeArray или Series или DataFrame столбец, поддерживаемый DatetimeArray не удается разобрать эти строки (GH 44236)

  • Ошибка в Series.__setitem__() с целочисленным dtype, отличным от int64 настройка с range объект ненужно повышает тип до int64 (GH 44261)

  • Ошибка в Series.__setitem__() с булевым маскирующим индексатором, который неправильно транслирует списокоподобное значение длины 1 (GH 44265)

  • Ошибка в Series.reset_index() не игнорируя name аргумент, когда drop и inplace установлены в True (GH 44575)

  • Ошибка в DataFrame.loc.__setitem__() и DataFrame.iloc.__setitem__() со смешанными типами данных иногда не удавалось выполнить на месте (GH 44345)

  • Ошибка в DataFrame.loc.__getitem__() некорректное возбуждение KeyError при выборе одного столбца с булевым ключом (GH 44322).

  • Ошибка при установке DataFrame.iloc() с одним ExtensionDtype столбец и установка 2D-значений, например, df.iloc[:] = df.values неправильное возникновение (GH 44514)

  • Ошибка при установке значений с DataFrame.iloc() с одним ExtensionDtype столбец и кортеж массивов в качестве индексатора (GH 44703)

  • Ошибка при индексации столбцов с loc или iloc использование среза с отрицательным шагом с ExtensionDtype столбцы неправильно вызывают (GH 44551)

  • Ошибка в DataFrame.loc.__setitem__() изменение типа данных, когда индексатор был полностью False (GH 37550)

  • Ошибка в IntervalIndex.get_indexer_non_unique() возвращает булеву маску вместо массива целых чисел для неуникального и немонотонного индекса (GH 44084)

  • Ошибка в IntervalIndex.get_indexer_non_unique() не обрабатывает цели dtype 'object' с NaN правильно (GH 44482)

  • Исправлена регрессия, где один столбец np.matrix больше не приводился к одномерному np.ndarray при добавлении к DataFrame (GH 42376)

  • Ошибка в Series.__getitem__() с CategoricalIndex целых чисел, обрабатывающих списки целых чисел как позиционные индексаторы, что не согласуется с поведением с одним скалярным целым числом (GH 15470, GH 14865)

  • Ошибка в Series.__setitem__() при установке чисел с плавающей точкой или целых чисел в целочисленный тип данных Series не выполняя повышение типа данных, когда это необходимо для сохранения точности (GH 45121)

  • Ошибка в DataFrame.iloc.__setitem__() игнорирует аргумент axis (GH 45032)

Отсутствует#

  • Ошибка в DataFrame.fillna() с limit и нет method игнорирует axis='columns' или axis = 1 (GH 40989, GH 17399)

  • Ошибка в DataFrame.fillna() не заменяя пропущенные значения при использовании словарного объекта value и дублирующиеся имена столбцов (GH 43476)

  • Ошибка при построении DataFrame со словарём np.datetime64 как значение и dtype='timedelta64[ns]', или наоборот, некорректное приведение вместо вызова исключения (GH 44428)

  • Ошибка в Series.interpolate() и DataFrame.interpolate() с inplace=True без записи в исходный массив(ы) на месте (GH 44749)

  • Ошибка в Index.fillna() некорректно возвращает незаполненный Index когда присутствуют значения NA и downcast аргумент указан. Теперь вызывает исключение NotImplementedError вместо этого; не передавайте downcast аргумент (GH 44873)

  • Ошибка в DataFrame.dropna() изменение Index даже если ни одна запись не была удалена (GH 41965)

  • Ошибка в Series.fillna() с object-dtype некорректно игнорируя downcast="infer" (GH 44241)

MultiIndex#

  • Ошибка в MultiIndex.get_loc() где первый уровень является DatetimeIndex и передана строковая клавиша (GH 42465)

  • Ошибка в MultiIndex.reindex() при передаче level который соответствует ExtensionDtype уровень (GH 42043)

  • Ошибка в MultiIndex.get_loc() вызов TypeError вместо KeyError на вложенном кортеже (GH 42440)

  • Ошибка в MultiIndex.union() установка неправильного sortorder вызывая ошибки в последующих операциях индексирования со срезами (GH 44752)

  • Ошибка в MultiIndex.putmask() где другое значение также было MultiIndex (GH 43212)

  • Ошибка в MultiIndex.dtypes() дублирующиеся имена уровней возвращали только один тип данных на имя (GH 45174)

I/O#

  • Ошибка в read_excel() попытка чтения листов диаграмм из файлов .xlsx (GH 41448)

  • Ошибка в json_normalize() где errors=ignore мог не игнорировать пропущенные значения meta когда record_path имеет длину больше единицы (GH 41876)

  • Ошибка в read_csv() с многоуровневым заголовком и аргументами, ссылающимися на имена столбцов как кортежи (GH 42446)

  • Ошибка в read_fwf(), где разница в длинах colspecs и names не вызывал ValueError (GH 40830)

  • Ошибка в Series.to_json() и DataFrame.to_json() где некоторые атрибуты были пропущены при сериализации простых объектов Python в JSON (GH 42768, GH 33043)

  • Заголовки столбцов удаляются при построении DataFrame из sqlalchemy Row объект (GH 40682)

  • Ошибка при распаковке Index с типом object, некорректно определяющим числовые типы (GH 43188)

  • Ошибка в read_csv() где чтение многоуровневого заголовка с неравными длинами некорректно вызывало IndexError (GH 43102)

  • Ошибка в read_csv() вызов ParserError при чтении файла по частям и некоторые блоки частей имеют меньше столбцов, чем заголовок для engine="c" (GH 21211)

  • Ошибка в read_csv(), изменён класс исключения при ожидании имени пути к файлу или файлоподобного объекта с OSError to TypeError (GH 43366)

  • Ошибка в read_csv() и read_fwf() игнорируя все skiprows кроме первого, когда nrows указан для engine='python' (GH 44021, GH 10261)

  • Ошибка в read_csv() сохранение исходного столбца в объектном формате, когда keep_date_col=True установлен (GH 13378)

  • Ошибка в read_json() неправильная обработка не-numpy типов данных (особенно category) (GH 21892, GH 33205)

  • Ошибка в json_normalize() где многозначные sep параметр неправильно добавляется в начало каждого ключа (GH 43831)

  • Ошибка в json_normalize() где чтение данных с отсутствующими многоуровневыми метаданными не учитывало errors="ignore" (GH 44312)

  • Ошибка в read_csv() использовал вторую строку для определения неявного индекса, если header был установлен в None для engine="python" (GH 22144)

  • Ошибка в read_csv() не распознает некорректные строки, когда names были указаны для engine="c" (GH 22144)

  • Ошибка в read_csv() с float_precision="round_trip" который не пропускал начальные/конечные пробелы (GH 43713)

  • Ошибка, когда Python собран без модуля lzma: предупреждение выдавалось при импорте pandas, даже если возможность lzma не используется (GH 43495)

  • Ошибка в read_csv() не применяя dtype для index_col (GH 9435)

  • Ошибка при дампинге/загрузке DataFrame с yaml.dump(frame) (GH 42748)

  • Ошибка в read_csv() вызов ValueError когда names был длиннее header но равно строкам данных для engine="python" (GH 38453)

  • Ошибка в ExcelWriter, где engine_kwargs не передавались во все движки (GH 43442)

  • Ошибка в read_csv() вызов ValueError когда parse_dates использовался с MultiIndex столбцы (GH 8991)

  • Ошибка в read_csv() не вызывая ValueError когда \n был указан как delimiter или sep что конфликтует с lineterminator (GH 43528)

  • Ошибка в to_csv() преобразование дат и времени в категориальные Series в целые числа (GH 40754)

  • Ошибка в read_csv() преобразование столбцов в числовые после неудачного разбора даты (GH 11019)

  • Ошибка в read_csv() не заменяя NaN значения с np.nan перед попыткой преобразования даты (GH 26203)

  • Ошибка в read_csv() вызов AttributeError при попытке чтения файла .csv и определении типа данных столбца индекса из nullable integer type (GH 44079)

  • Ошибка в to_csv() всегда принудительное преобразование столбцов даты и времени с разными форматами к одному формату (GH 21734)

  • DataFrame.to_csv() и Series.to_csv() с compression установлено в 'zip' больше не создают zip-файл, содержащий файл с расширением “.zip”. Вместо этого они пытаются более умно определить имя внутреннего файла (GH 39465)

  • Ошибка в read_csv() где чтение смешанного столбца булевых значений и пропущенных значений в тип float приводит к тому, что пропущенные значения становятся 1.0 вместо NaN (GH 42808, GH 34120)

  • Ошибка в to_xml() вызов ошибки для pd.NA с типом данных массива расширений (GH 43903)

  • Ошибка в read_csv() при одновременной передаче парсера в date_parser и parse_dates=False, парсинг всё равно был вызван (GH 44366)

  • Ошибка в read_csv() не устанавливает имя MultiIndex столбцы корректно, когда index_col не является первым столбцом (GH 38549)

  • Ошибка в read_csv() тихое игнорирование ошибок при неудачной попытке создания файла с отображением в память (GH 44766)

  • Ошибка в read_csv() при передаче tempfile.SpooledTemporaryFile открыт в бинарном режиме (GH 44748)

  • Ошибка в read_json() вызов ValueError при попытке разбора json-строк, содержащих “://” (GH 36271)

  • Ошибка в read_csv() когда engine="c" и encoding_errors=None что вызвало segfault (GH 45180)

  • Ошибка в read_csv() недопустимое значение usecols приводя к незакрытому файловому дескриптору (GH 45384)

  • Ошибка в DataFrame.to_json() исправить утечку памяти (GH 43877)

Period#

  • Ошибка при добавлении Period объект в np.timedelta64 объект некорректно вызывает TypeError (GH 44182)

  • Ошибка в PeriodIndex.to_timestamp() когда индекс имеет freq="B" вывод freq="D" для его результата вместо freq="B" (GH 44105)

  • Ошибка в Period конструктор некорректно разрешал np.timedelta64("NaT") (GH 44507)

  • Ошибка в PeriodIndex.to_timestamp() давая некорректные значения для индексов с несмежными данными (GH 44100)

  • Ошибка в Series.where() с PeriodDtype неправильно вызывалось исключение, когда where вызов не должен ничего заменять (GH 45135)

Построение графиков#

  • При передаче нечисловых данных, DataFrame.boxplot() теперь вызывает ValueError вместо загадочного KeyError или ZeroDivisionError, в соответствии с другими функциями построения графиков, такими как DataFrame.hist() (GH 43480)

Groupby/resample/rolling#

  • Ошибка в SeriesGroupBy.apply() где передача нераспознанного строкового аргумента не вызывала TypeError когда базовый Series пуст (GH 42021)

  • Ошибка в Series.rolling.apply(), DataFrame.rolling.apply(), Series.expanding.apply() и DataFrame.expanding.apply() с engine="numba" где *args кэшировались с переданной пользователем функцией (GH 42287)

  • Ошибка в DataFrameGroupBy.max(), SeriesGroupBy.max(), DataFrameGroupBy.min(), и SeriesGroupBy.min() с потерей точности у целочисленных dtypes с поддержкой null (GH 41743)

  • Ошибка в DataFrame.groupby.rolling.var() будет вычислять скользящую дисперсию только для первой группы (GH 42442)

  • Ошибка в DataFrameGroupBy.shift() и SeriesGroupBy.shift() который вернул бы группирующие столбцы, если fill_value не был None (GH 41556)

  • Ошибка в SeriesGroupBy.nlargest() и SeriesGroupBy.nsmallest() имел бы несогласованный индекс, когда входные данные Series был отсортирован и n было больше или равно всем размерам групп (GH 15272, GH 16345, GH 29129)

  • Ошибка в pandas.DataFrame.ewm(), где типы данных, отличные от float64, молча завершались ошибкой (GH 42452)

  • Ошибка в pandas.DataFrame.rolling() операция по строкам (axis=1) неправильно пропускает столбцы, содержащие float16 и float32 (GH 41779)

  • Ошибка в Resampler.aggregate() не позволял использовать Named Aggregation (GH 32803)

  • Ошибка в Series.rolling() когда Series dtype был Int64 (GH 43016)

  • Ошибка в DataFrame.rolling.corr() когда DataFrame columns было MultiIndex (GH 21157)

  • Ошибка в DataFrame.groupby.rolling() при указании on и вызов __getitem__ впоследствии возвращал бы некорректные результаты (GH 43355)

  • Ошибка в DataFrameGroupBy.apply() и SeriesGroupBy.apply() с временной Grouper объекты, некорректно вызывающие ValueError в крайних случаях, когда вектор группировки содержит NaT (GH 43500, GH 43515)

  • Ошибка в DataFrameGroupBy.mean() и SeriesGroupBy.mean() с ошибкой complex тип данных (GH 43701)

  • Ошибка в Series.rolling() и DataFrame.rolling() неправильный расчёт границ окна для первой строки, когда center=True и индекс убывает (GH 43927)

  • Ошибка в Series.rolling() и DataFrame.rolling() для центрированных окон типа datetime с неравномерными наносекундами (GH 43997)

  • Ошибка в DataFrameGroupBy.mean() и SeriesGroupBy.mean() вызов KeyError когда столбец был выбран как минимум дважды (GH 44924)

  • Ошибка в DataFrameGroupBy.nth() и SeriesGroupBy.nth() неудача на axis=1 (GH 43926)

  • Ошибка в Series.rolling() и DataFrame.rolling() не учитывая правую границу для центрированных окон, подобных datetime, если индекс содержит дубликаты (GH 3944)

  • Ошибка в Series.rolling() и DataFrame.rolling() при использовании pandas.api.indexers.BaseIndexer подкласс, который возвращал неравные массивы начала и конца, приводил к ошибке сегментации вместо вызова исключения ValueError (GH 44470)

  • Ошибка в Groupby.nunique() не учитывая observed=True для categorical столбцы группировки (GH 45128)

  • Ошибка в DataFrameGroupBy.head(), SeriesGroupBy.head(), DataFrameGroupBy.tail(), и SeriesGroupBy.tail() не удаляя группы с NaN когда dropna=True (GH 45089)

  • Ошибка в GroupBy.__iter__() после выбора подмножества столбцов в GroupBy объект, который возвращал все столбцы вместо выбранного подмножества (GH 44821)

  • Ошибка в Groupby.rolling() когда переданы немонотонные данные, не удаётся правильно вызвать ValueError (GH 43909)

  • Ошибка, при группировке по Series который имеет categorical тип данных и длина не равны оси группировки, вызвано ValueError (GH 44179)

Изменение формы#

  • Улучшено сообщение об ошибке при создании DataFrame столбец из многомерного numpy.ndarray (GH 42463)

  • Ошибка в concat() создание MultiIndex с дублирующимися записями уровней при конкатенации DataFrame с дубликатами в Index и несколько ключей (GH 42651)

  • Ошибка в pandas.cut() на Series с дублирующимися индексами и неточными pandas.CategoricalIndex() (GH 42185, GH 42425)

  • Ошибка в DataFrame.append() не удаётся сохранить типы данных, когда добавляемые столбцы не совпадают (GH 43392)

  • Ошибка в concat() of bool и boolean типы данных, приводящие к object dtype вместо boolean тип данных (GH 42800)

  • Ошибка в crosstab() когда входные данные являются категориальными Series, существуют категории, которые отсутствуют в одном или обоих из Series, и margins=True. Ранее значение маржи для отсутствующих категорий было NaN. Теперь корректно сообщается как 0 (GH 43505)

  • Ошибка в concat() завершалось ошибкой, когда objs аргумент имел одинаковый индекс и keys аргумент содержал дубликаты (GH 43595)

  • Ошибка в concat() который игнорировал sort параметр (GH 43375)

  • Ошибка в merge() с MultiIndex в качестве индекса столбца для on аргумент, возвращающий ошибку при назначении столбца внутренне (GH 43734)

  • Ошибка в crosstab() завершалось ошибкой, когда входные данные являются списками или кортежами (GH 44076)

  • Ошибка в DataFrame.append() не удалось сохранить index.name при добавлении списка Series объекты (GH 44109)

  • Исправлено распространение фиксированных метаданных в Dataframe.apply() метод, следовательно, исправляя ту же проблему для Dataframe.transform(), Dataframe.nunique() и Dataframe.mode() (GH 28283)

  • Ошибка в concat() уровни приведения MultiIndex в float, если все уровни состоят только из пропущенных значений (GH 44900)

  • Ошибка в DataFrame.stack() с ExtensionDtype столбцы неправильно вызывают (GH 43561)

  • Ошибка в merge() вызов KeyError при объединении по индексам с разными именами с использованием ключевых слов on (GH 45094)

  • Ошибка в Series.unstack() с объектом, выполняющим нежелательный вывод типов для результирующих столбцов (GH 44595)

  • Ошибка в MultiIndex.join() с перекрывающимися IntervalIndex уровни (GH 44096)

  • Ошибка в DataFrame.replace() и Series.replace() результаты отличаются dtype на основе regex параметр (GH 44864)

  • Ошибка в DataFrame.pivot() с index=None когда DataFrame индекс был MultiIndex (GH 23955)

Разреженный#

  • Ошибка в DataFrame.sparse.to_coo() вызов AttributeError когда имена столбцов не уникальны (GH 29564)

  • Ошибка в SparseArray.max() и SparseArray.min() вызов ValueError для массивов с 0 ненулевыми элементами (GH 43527)

  • Ошибка в DataFrame.sparse.to_coo() тихое преобразование ненулевых значений заполнения в нулевые (GH 24817)

  • Ошибка в SparseArray методы сравнения с операндом в виде массива несовпадающей длины вызывают AssertionError или неясно ValueError в зависимости от входных данных (GH 43863)

  • Ошибка в SparseArray арифметические методы floordiv и mod поведение при делении на ноль не соответствует неразреженному Series поведение (GH 38172)

  • Ошибка в SparseArray унарные методы, а также SparseArray.isna() не пересчитывает индексы (GH 44955)

ExtensionArray#

  • Ошибка в array() не удаётся сохранить PandasArray (GH 43887)

  • NumPy ufuncs np.abs, np.positive, np.negative теперь корректно сохраняет тип данных при вызове на ExtensionArrays, которые реализуют __abs__, __pos__, __neg__, соответственно. В частности, это исправлено для TimedeltaArray (GH 43899, GH 23316)

  • NumPy ufuncs np.minimum.reduce np.maximum.reduce, np.add.reduce, и np.prod.reduce теперь работают корректно вместо вызова исключения NotImplementedError на Series с IntegerDtype или FloatDtype (GH 43923, GH 44793)

  • NumPy ufuncs с out ключевое слово теперь поддерживается массивами с IntegerDtype и FloatingDtype (GH 45122)

  • Избегать вызова исключения PerformanceWarning о фрагментированных DataFrame при использовании многих столбцов с расширенным типом данных (GH 44098)

  • Ошибка в IntegerArray и FloatingArray конструкция некорректно преобразует несовпадающие значения NA (например, np.timedelta64("NaT")) в числовое NA (GH 44514)

  • Ошибка в BooleanArray.__eq__() и BooleanArray.__ne__() вызов TypeError при сравнении с несовместимым типом (например, строкой). Это вызывало DataFrame.replace() иногда вызывает TypeError если был включен nullable boolean столбец (GH 44499)

  • Ошибка в array() неправильно вызывает ошибку при передаче ndarray с float16 тип данных (GH 44715)

  • Ошибка при вызове np.sqrt на BooleanArray возвращая некорректный FloatingArray (GH 44715)

  • Ошибка в Series.where() с ExtensionDtype когда other является скаляром NA, несовместимым с Series тип данных (например, NaT с числовым dtype) неправильно приводится к совместимому значению NA (GH 44697)

  • Ошибка в Series.replace() где явная передача value=None обрабатывается как если бы не было value был передан, и None не включены в результат (GH 36984, GH 19998)

  • Ошибка в Series.replace() с нежелательным понижающим приведением типов при заменах без эффекта (GH 44498)

  • Ошибка в Series.replace() с FloatDtype, string[python], или string[pyarrow] тип данных не сохраняется, когда это возможно (GH 33484, GH 40732, GH 31644, GH 41215, GH 25438)

Styler#

  • Ошибка в Styler где uuid при инициализации сохранял плавающее подчеркивание (GH 43037)

  • Ошибка в Styler.to_html() где Styler объект обновлялся, если to_html метод был вызван с некоторыми аргументами (GH 43034)

  • Ошибка в Styler.copy() где uuid ранее не копировался (GH 40675)

  • Ошибка в Styler.apply() где функции, которые возвращали Series объекты не обрабатывались корректно с точки зрения выравнивания их меток индекса (GH 13657, GH 42014)

  • Ошибка при отображении пустого DataFrame с именованным Index (GH 43305)

  • Ошибка при отображении одного уровня MultiIndex (GH 43383)

  • Ошибка при комбинировании неразреженного рендеринга и Styler.hide_columns() или Styler.hide_index() (GH 43464)

  • Ошибка при установке стиля таблицы при использовании нескольких селекторов в Styler (GH 44011)

  • Ошибки, при которых обрезка строк и столбцов не отражала скрытые строки (GH 43703, GH 44247)

Другие#

  • Ошибка в DataFrame.astype() с неуникальными столбцами и Series dtype аргумент (GH 44417)

  • Ошибка в CustomBusinessMonthBegin.__add__() (CustomBusinessMonthEnd.__add__()) не применяя дополнительный offset параметр, когда начало (конец) целевого месяца уже является рабочим днём (GH 41356)

  • Ошибка в RangeIndex.union() с другим RangeIndex с совпадением (чётным) step и начинает отличаться строго меньше чем step / 2 (GH 44019)

  • Ошибка в RangeIndex.difference() с sort=None и step<0 не удалось отсортировать (GH 44085)

  • Ошибка в Series.replace() и DataFrame.replace() с value=None и ExtensionDtypes (GH 44270, GH 37899)

  • Ошибка в FloatingArray.equals() неудача при сравнении двух массивов как равных, если они содержат np.nan значения (GH 44382)

  • Ошибка в DataFrame.shift() с axis=1 и ExtensionDtype столбцы некорректно вызывали ошибку при несовместимом fill_value передается (GH 44564)

  • Ошибка в DataFrame.shift() с axis=1 и periods больше чем len(frame.columns) создавая недопустимый DataFrame (GH 44978)

  • Ошибка в DataFrame.diff() при передаче объекта NumPy integer вместо int объект (GH 44572)

  • Ошибка в Series.replace() вызов ValueError при использовании regex=True с Series содержащий np.nan значения (GH 43344)

  • Ошибка в DataFrame.to_records() где некорректный n использовался, когда отсутствующие имена заменялись на level_n (GH 44818)

  • Ошибка в DataFrame.eval() где resolvers аргумент переопределял стандартные резолверы (GH 34966)

  • Series.__repr__() и DataFrame.__repr__() больше не заменяет все нулевые значения в индексах на "NaN", а использует их реальные строковые представления. "NaN" используется только для float("nan") (GH 45263)

Участники#

Всего 275 человек внесли патчи в этот релиз. Люди со знаком «+» рядом с именами внесли патч впервые.

  • Abhishek R

  • Albert Villanova del Moral

  • Алессандро Бизиани +

  • Alex Lim

  • Alex-Gregory-1 +

  • Александр Городецкий

  • Александр Регейро +

  • Cython (написание C-расширений для pandas)

  • Alexis Mignon

  • Aleš Erjavec

  • Али МакМастер

  • Alibi +

  • Andrei Batomunkuev +

  • Andrew Eckart +

  • Andrew Hawyrluk

  • Andrew Wood

  • Anton Lodder +

  • Armin Berres +

  • Аруши Шарма +

  • Benedikt Heidrich +

  • Beni Bienz +

  • Benoît Vinot

  • Bert Palm +

  • Boris Rumyantsev +

  • Brian Hulette

  • Brock

  • Bruno Costa +

  • Bryan Racic +

  • Caleb Epstein

  • Calvin Ho

  • ChristofKaufmann +

  • Кристофер Йе +

  • Chuliang Xiao +

  • ClaudiaSilver +

  • DSM

  • Daniel Coll +

  • Daniel Schmidt +

  • Дар Адевуми

  • David +

  • Дэвид Сандерс +

  • David Wales +

  • Дерзан Чианг +

  • DeviousLab +

  • теперь также принимают именованный аргумент axis

  • Digres45 +

  • Dominik Kutra +

  • Дрю Левитт +

  • DriesS

  • EdAbati

  • Elle

  • Эллиот Рампоно

  • Endre Mark Borza

  • Эрфан Нариман

  • Evgeny Naumov +

  • Эвут тер Ховен +

  • Fangchen Li

  • Феликс Диво

  • Felix Dulys +

  • Франческо Андреуцци +

  • Francois Dion +

  • Frans Larsson +

  • Fred Reiss

  • GYvan

  • Gabriel Di Pardi Arruda +

  • Геза Штупперих

  • Giacomo Caria +

  • Грег Сиано +

  • Griffin Ansel

  • Hiroaki Ogasawara +

  • Horace +

  • Horace Lai +

  • Ирв Ластиг

  • Isaac Virshup

  • JHM Darbyshire (MBP)

  • JHM Darbyshire (iMac)

  • JHM Darbyshire +

  • Jack Liu

  • Jacob Skwirsk +

  • Jaime Di Cristina +

  • James Holcombe +

  • Janosh Riebesell +

  • Jarrod Millman

  • Jason Bian +

  • Jeff Reback

  • Jernej Makovsek +

  • Jim Bradley +

  • Joel Gibson +

  • Joeperdefloep +

  • Johannes Mueller +

  • John S Bogaardt +

  • John Zangwill +

  • Jon Haitz Legarreta Gorroño +

  • Джон Уиггинс +

  • Jonas Haag +

  • Joris Van den Bossche

  • Josh Friedlander

  • José Duarte +

  • Julian Fleischer +

  • Julien de la Bruère-T

  • Джастин МакОми

  • Kadatatlu Kishore +

  • Kaiqi Dong

  • Кашиф Хан +

  • Kavya9986 +

  • Kendall +

  • Кевин Шеппард

  • Kiley Hewitt

  • Koen Roelofs +

  • Krishna Chivukula

  • KrishnaSai2020

  • Leonardo Freua +

  • Leonardus Chen

  • Liang-Chi Hsieh +

  • Loic Diridollou +

  • Lorenzo Maffioli +

  • Luke Manley +

  • LunarLanding +

  • Марк Гарсия

  • Marcel Bittar +

  • Marcel Gerber +

  • Marco Edward Gorelli

  • Марко Горелли

  • Марко Горелли

  • Marvin +

  • Матеуш Пётрвский +

  • Mathias Hauser +

  • Matt Richards +

  • Мэттью Дэвис +

  • Мэтью Рёшке

  • Matthew Zeitlin

  • Маттиас Бюссонье

  • Matti Picus

  • Mauro Silberberg +

  • Максим Иванов

  • Maximilian Carr +

  • MeeseeksMachine

  • Michael Sarrazin +

  • Michael Wang +

  • Michał Górny +

  • Mike Phung +

  • Mike Taves +

  • Mohamad Hussein Rkein +

  • NJOKU OKECHUKWU VALENTINE +

  • Нил МакБернетт +

  • Nick Anderson +

  • Nikita Sobolev +

  • Оливье Каваденти +

  • PApostol +

  • Команда разработчиков Pandas

  • Patrick Hoefler

  • Peter

  • Peter Tillmann +

  • Prabha Arivalagan +

  • Pradyumna Rahul

  • Prerana Chakraborty

  • Притхвиджит +

  • Rahul Gaikwad +

  • Ray Bell

  • Ricardo Martins +

  • Richard Shadrach

  • Robbert-jan ‘t Hoen +

  • Robert Voyer +

  • Robin Raymond +

  • Rohan Sharma +

  • Рохан Сирохия +

  • Roman Yurchak

  • Ruan Pretorius +

  • Sam James +

  • Scott Talbert

  • Шашват Шарма +

  • Sheogorath27 +

  • Shiv Gupta

  • Shoham Debnath

  • Simon Hawkins

  • Soumya +

  • Stan West +

  • Stefanie Molin +

  • Stefano Alberto Russo +

  • Стефан Хессельманн

  • Stephen

  • Suyash Gupta +

  • Sven

  • Swanand01 +

  • Sylvain Marié +

  • TLouf

  • Тания Аллард +

  • Терджи Петерсен

  • TheDerivator +

  • Thomas Dickson

  • Thomas Kastl +

  • Томас Клуйвер

  • Thomas Li

  • Томас Смит

  • Tim Swast

  • Tim Tran +

  • Tobias McNulty +

  • Tobias Pitters

  • Tomoki Nakagawa +

  • Tony Hirst +

  • Torsten Wörtwein

  • В.И. Вуд +

  • Vaibhav K +

  • Valentin Oliver Loftsson +

  • Varun Shrivastava +

  • Vivek Thazhathattil +

  • Vyom Pathak

  • Wenjun Si

  • William Andrea +

  • William Bradley +

  • Wojciech Sadowski +

  • Яо-Чин Хуан +

  • Яш Гупта +

  • Yiannis Hadjicharalambous +

  • Yoshiki Vázquez Baeza

  • Yuanhao Geng

  • Юрий Михайлов

  • Yvan Gatete +

  • Yves Delley +

  • Zach Rait

  • Zbyszek Królikowski +

  • Zero +

  • Zheyuan

  • Zhiyi Wu +

  • aiudirog

  • ali sayyah +

  • aneesh98 +

  • aptalca

  • arw2019 +

  • attack68

  • brendandrury +

  • bubblingoak +

  • calvinsomething +

  • claws +

  • deponovo +

  • dicristina

  • el-g-1 +

  • evensure +

  • fotino21 +

  • fshi01 +

  • gfkang +

  • github-actions[bot]

  • i-aki-y

  • jbrockmendel

  • jreback

  • juliandwain +

  • jxb4892 +

  • kendall smith +

  • lmcindewar +

  • lrepiton

  • maximilianaccardo +

  • michal-gh

  • neelmraman

  • partev

  • phofl +

  • pratyushsharan +

  • quantumalaviya +

  • rafael +

  • перечитать

  • rocabrera +

  • rosagold

  • saehuihwang +

  • salomondush +

  • shubham11941140 +

  • srinivasan +

  • stphnlyd

  • suoniq

  • trevorkask +

  • tushushu

  • tyuyoshi +

  • usersblock +

  • vernetya +

  • vrserpa +

  • willie3838 +

  • zeitlinv +

  • zhangxiaoxing +