Что нового в версии 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']}
Другие улучшения#
concat()сохранитattrsкогда это одинаково для всех объектов, и отбрасыватьattrsкогда они различаются (GH 41828)DataFrameGroupByоперации сas_index=Falseтеперь правильно сохраняютExtensionDtypeтипы данных для столбцов, по которым выполняется группировка (GH 41373)Добавлена поддержка присваивания значений
byаргумент вDataFrame.plot.hist()иDataFrame.plot.box()(GH 15079)Series.sample(),DataFrame.sample(),DataFrameGroupBy.sample(), иSeriesGroupBy.sample()теперь принимаетnp.random.Generatorв качестве входных данных дляrandom_state. Генератор будет более производительным, особенно сreplace=False(GH 38100)Series.ewm()иDataFrame.ewm()теперь поддерживаетmethodаргумент с'table'опция, которая выполняет оконную операцию по всемуDataFrame. См. Обзор оконных функций для производительности и функциональных преимуществ (GH 42273)DataFrameGroupBy.cummin(),SeriesGroupBy.cummin(),DataFrameGroupBy.cummax(), иSeriesGroupBy.cummax()теперь поддерживают аргументskipna(GH 34047)read_table()теперь поддерживает аргументstorage_options(GH 39167)DataFrame.to_stata()иStataWriter()теперь принимает аргумент только по ключевому словуvalue_labelsдля сохранения меток для некатегориальных столбцов (GH 38454)Методы, которые полагались на алгоритмы на основе хэш-карт, такие как
DataFrameGroupBy.value_counts(),DataFrameGroupBy.count()иfactorize()игнорировалась мнимая часть для комплексных чисел (GH 17927)Добавить
Series.str.removeprefix()иSeries.str.removesuffix()введено в Python 3.9 для удаления префиксов/суффиксов из строкового типаSeries(GH 36944)Попытка записи в файл в отсутствующей родительской директории с
DataFrame.to_csv(),DataFrame.to_html(),DataFrame.to_excel(),DataFrame.to_feather(),DataFrame.to_parquet(),DataFrame.to_stata(),DataFrame.to_json(),DataFrame.to_pickle(), иDataFrame.to_xml()теперь явно упоминает отсутствующую родительскую директорию, то же самое верно дляSeriesаналоги (GH 24306)Индексирование с
.locи.ilocтеперь поддерживаетEllipsis(GH 37750)IntegerArray.all(),IntegerArray.any(),FloatingArray.any(), иFloatingArray.all()использовать логику Клини (GH 41967)Добавлена поддержка nullable boolean и integer типов в
DataFrame.to_stata(),StataWriter,StataWriter117, иStataWriterUTF8(GH 40855)DataFrame.__pos__()иDataFrame.__neg__()теперь сохраняютExtensionDtypeтипы данных (GH 43883)Ошибка, возникающая, когда необязательная зависимость не может быть импортирована, теперь включает исходное исключение для упрощения исследования (GH 43882)
Добавлен
ExponentialMovingWindow.sum()(GH 13297)Series.str.split()теперь поддерживаетregexаргумент, который явно указывает, является ли шаблон регулярным выражением. По умолчаниюNone(GH 43563, GH 32835, GH 25549)DataFrame.dropna()теперь принимает одну метку какsubsetвместе с массивоподобными (GH 41021)Добавлен
DataFrameGroupBy.value_counts()(GH 43564)read_csv()теперь принимаетcallableфункция вon_bad_linesкогдаengine="python"для пользовательской обработки некорректных строк (GH 5686)ExcelWriterаргументif_sheet_exists="overlay"опция добавлена (GH 40231)read_excel()теперь принимаетdecimalаргумент, который позволяет пользователю указать десятичную точку при разборе строковых столбцов в числовые (GH 14403)DataFrameGroupBy.mean(),SeriesGroupBy.mean(),DataFrameGroupBy.std(),SeriesGroupBy.std(),DataFrameGroupBy.var(),SeriesGroupBy.var(),DataFrameGroupBy.sum(), иSeriesGroupBy.sum()теперь поддерживает Numba выполнение с помощьюengineключевое слово (GH 43731, GH 44862, GH 44939)Timestamp.isoformat()теперь обрабатываетtimespecаргумент из базовогоdatetimeкласс (GH 26131)NaT.to_numpy()dtypeаргумент теперь учитывается, поэтомуnp.timedelta64может быть возвращён (GH 44460)Новая опция
display.max_dir_itemsнастраивает количество столбцов, добавленных кDataframe.__dir__()и предложено для автодополнения (GH 37996)Добавлен “День независимости Джунита” в
USFederalHolidayCalendar(GH 44574)Rolling.var(),Expanding.var(),Rolling.std(), иExpanding.std()теперь поддерживает Numba выполнение с помощьюengineключевое слово (GH 44461)Series.info()был добавлен для совместимости сDataFrame.info()(GH 5167)Реализовано
IntervalArray.min()иIntervalArray.max(), в результате чегоminиmaxтеперь работают дляIntervalIndex,SeriesиDataFrameсIntervalDtype(GH 44746)UInt64Index.map()теперь сохраняетdtypeгде возможно (GH 44609)read_json()теперь может парсить целые числа без знака типа unsigned long long (GH 26068)DataFrame.take()теперь вызываетTypeErrorпри передаче скаляра для индексатора (GH 42875)is_list_like()теперь определяет duck-массивы как подобные списку, если только.ndim == 0(GH 35131)ExtensionDtypeиExtensionArrayтеперь (де)сериализуются при экспортеDataFrameсDataFrame.to_json()используяorient='table'(GH 20612, GH 44705)Добавлена поддержка для Zstandard сжатие до
DataFrame.to_pickle()/read_pickle()и аналогичные функции (GH 43925)DataFrame.to_sql()теперь возвращаетintколичества записанных строк (GH 23998)
Значительные исправления ошибок#
Это исправления ошибок, которые могут привести к заметным изменениям в поведении.
Несогласованный разбор строк дат#
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 UTCTimestamp(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)
Улучшения производительности#
Улучшение производительности в
DataFrameGroupBy.sample()иSeriesGroupBy.sample(), особенно когдаweightsаргумент предоставлен (GH 34483)Улучшение производительности при преобразовании нестроковых массивов в строковые массивы (GH 34483)
Улучшение производительности в
DataFrameGroupBy.transform()иSeriesGroupBy.transform()для пользовательских функций (GH 41598)Улучшение производительности при построении
DataFrameобъекты (GH 42631, GH 43142, GH 43147, GH 43307, GH 43144, GH 44826)Улучшение производительности в
DataFrameGroupBy.shift()иSeriesGroupBy.shift()когдаfill_valueаргумент предоставлен (GH 26615)Улучшение производительности в
DataFrame.corr()дляmethod=pearsonна данных без пропущенных значений (GH 40956)Улучшение производительности в некоторых
DataFrameGroupBy.apply()иSeriesGroupBy.apply()операции (GH 42992, GH 43578)Улучшение производительности в
read_stata()(GH 43059, GH 43227)Улучшение производительности в
read_sas()(GH 43333)Улучшение производительности в
to_datetime()сuintтипы данных (GH 42606)Улучшение производительности в
to_datetime()сinfer_datetime_formatустановлено вTrue(GH 43901)Улучшение производительности в
Series.sparse.to_coo()(GH 42880)Улучшение производительности при индексировании с
UInt64Index(GH 43862)Улучшение производительности при индексировании с
Float64Index(GH 43705)Улучшение производительности при индексировании с неуникальным
Index(GH 43792)Улучшение производительности при индексировании с помощью спископодобного индексатора на
MultiIndex(GH 43370)Улучшение производительности при индексировании с
MultiIndexиндексатор на другомMultiIndex(GH 43370)Улучшение производительности в
DataFrameGroupBy.quantile()иSeriesGroupBy.quantile()(GH 43469, GH 43725)Улучшение производительности в
DataFrameGroupBy.count()иSeriesGroupBy.count()(GH 43730, GH 43694)Улучшение производительности в
DataFrameGroupBy.any(),SeriesGroupBy.any(),DataFrameGroupBy.all(), иSeriesGroupBy.all()(GH 43675, GH 42841)Улучшение производительности в
DataFrameGroupBy.std()иSeriesGroupBy.std()(GH 43115, GH 43576)Улучшение производительности в
DataFrameGroupBy.cumsum()иSeriesGroupBy.cumsum()(GH 43309)SparseArray.min()иSparseArray.max()больше не требует преобразования в плотный массив (GH 43526)Индексация в
SparseArrayсsliceсstep=1больше не требует преобразования в плотный массив (GH 43777)Улучшение производительности в
SparseArray.take()сallow_fill=False(GH 43654)Улучшение производительности в
Rolling.mean(),Expanding.mean(),Rolling.sum(),Expanding.sum(),Rolling.max(),Expanding.max(),Rolling.min()иExpanding.min()сengine="numba"(GH 43612, GH 44176, GH 45170)Улучшена производительность
pandas.read_csv()сmemory_map=Trueкогда кодировка файла UTF-8 (GH 43787)Улучшение производительности в
RangeIndex.sort_values()переопределениеIndex.sort_values()(GH 43666)Улучшение производительности в
RangeIndex.insert()(GH 43988)Улучшение производительности в
Index.insert()(GH 43953)Улучшение производительности в
DatetimeIndex.tolist()(GH 43823)Улучшение производительности в
DatetimeIndex.union()(GH 42353)Улучшение производительности в
Series.nsmallest()(GH 43696)Улучшение производительности в
DataFrame.insert()(GH 42998)Улучшение производительности в
DataFrame.dropna()(GH 43683)Улучшение производительности в
DataFrame.fillna()(GH 43316)Улучшение производительности в
DataFrame.values()(GH 43160)Улучшение производительности в
DataFrame.select_dtypes()(GH 42611)Улучшение производительности в
DataFrameредукции (GH 43185, GH 43243, GH 43311, GH 43609)Улучшение производительности в
Series.unstack()иDataFrame.unstack()(GH 43335, GH 43352, GH 42704, GH 43025)Улучшение производительности в
Series.to_frame()(GH 43558)Улучшение производительности в
Series.mad()(GH 43010)Улучшение производительности в
to_csv()когда столбец индекса является датой и форматирован (GH 39413)Улучшение производительности в
to_csv()когдаMultiIndexсодержит много неиспользуемых уровней (GH 37484)Улучшение производительности в
read_csv()когдаindex_colбыл установлен с числовым столбцом (GH 44158)Улучшение производительности в
SparseArray.__getitem__()(GH 23122)Улучшение производительности при создании
DataFrameиз массивоподобных объектов, таких какPytorchтензор (GH 44616)
Исправления ошибок#
Категориальный#
Ошибка при установке значений, несовместимых с dtype, в
Categorical(илиSeriesилиDataFrameподдерживаемыйCategorical) вызываяValueErrorвместоTypeError(GH 41919)Ошибка в
Categorical.searchsorted()при передаче значения, несовместимого с типом данных, вызываяKeyErrorвместоTypeError(GH 41919)Ошибка в
Categorical.astype()приведение дат иTimestampв int для dtypeobject(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#
Ошибка в делении всех-
NaTTimeDeltaIndex,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для dtypebool(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()не разрешая преобразование изPeriodDtypetodatetime64типа данных, несовместимого с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из sqlalchemyRowобъект (GH 40682)Ошибка при распаковке
Indexс типом object, некорректно определяющим числовые типы (GH 43188)Ошибка в
read_csv()где чтение многоуровневого заголовка с неравными длинами некорректно вызывалоIndexError(GH 43102)Ошибка в
read_csv()вызовParserErrorпри чтении файла по частям и некоторые блоки частей имеют меньше столбцов, чем заголовок дляengine="c"(GH 21211)Ошибка в
read_csv(), изменён класс исключения при ожидании имени пути к файлу или файлоподобного объекта сOSErrortoTypeError(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()когдаSeriesdtypeбылInt64(GH 43016)Ошибка в
DataFrame.rolling.corr()когдаDataFramecolumns было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()ofboolиbooleanтипы данных, приводящие кobjectdtype вместо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.reducenp.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()с неуникальными столбцами иSeriesdtypeаргумент (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 +