Что нового в версии 1.2.0 (26 декабря 2020)#
Это изменения в pandas 1.2.0. См. Примечания к выпуску для полного списка изменений, включая другие версии pandas.
Предупреждение
The xlwt пакет для записи в старом стиле .xls
файлы Excel больше не поддерживаются.
xlrd пакет теперь только для чтения
старых версий .xls файлы.
Ранее аргумент по умолчанию engine=None to read_excel()
привело бы к использованию xlrd движок во многих случаях, включая новый Excel 2007+ (.xlsx) файлы.
Если openpyxl установлен,
многие из этих случаев теперь по умолчанию будут использовать openpyxl движок.
См. read_excel() документация для получения дополнительных сведений.
Таким образом, настоятельно рекомендуется установить openpyxl для чтения Excel 2007+
(.xlsx) файлы.
Пожалуйста, не сообщайте о проблемах при использовании ``xlrd`` для чтения файлов ``.xlsx``.
Это больше не поддерживается, переключитесь на использование openpyxl вместо этого.
Попытка использовать xlwt движок вызовет FutureWarning
если не установлена опция io.excel.xls.writer установлено в "xlwt".
Хотя эта опция теперь устарела и также вызовет FutureWarning,
это можно установить глобально и подавить предупреждение. Пользователям рекомендуется
писать .xlsx файлы с использованием openpyxl движок вместо этого.
Улучшения#
Опционально запрещать дублирующиеся метки#
Series и DataFrame теперь можно создать с allows_duplicate_labels=False флаг для контроля, может ли индекс или столбцы содержать повторяющиеся метки (GH 28394). Это можно использовать для
предотвращения случайного введения дублирующихся меток, которые могут повлиять на последующие операции.
По умолчанию дубликаты по-прежнему разрешены.
In [1]: pd.Series([1, 2], index=['a', 'a'])
Out[1]:
a 1
a 2
Length: 2, dtype: int64
In [2]: pd.Series([1, 2], index=['a', 'a']).set_flags(allows_duplicate_labels=False)
...
DuplicateLabelError: Index has duplicates.
positions
label
a [0, 1]
pandas будет распространять allows_duplicate_labels свойство через множество операций.
In [3]: a = (
...: pd.Series([1, 2], index=['a', 'b'])
...: .set_flags(allows_duplicate_labels=False)
...: )
In [4]: a
Out[4]:
a 1
b 2
Length: 2, dtype: int64
# An operation introducing duplicates
In [5]: a.reindex(['a', 'b', 'a'])
...
DuplicateLabelError: Index has duplicates.
positions
label
a [0, 2]
[1 rows x 1 columns]
Предупреждение
Это экспериментальная функция. В настоящее время многие методы не
распространяют allows_duplicate_labels значение. В будущих версиях ожидается, что каждый метод, принимающий или возвращающий один или несколько объектов DataFrame или Series, будет распространять allows_duplicate_labels.
См. Дублирующиеся метки подробнее.
The allows_duplicate_labels флаг хранится в новом DataFrame.flags
атрибут. Это хранит глобальные атрибуты, применяемые к объект pandas. Это отличается от DataFrame.attrs, который хранит информацию, применимую к набору данных.
Передача аргументов в бэкенды fsspec#
Многие функции чтения/записи приобрели storage_options необязательным аргументом,
для передачи словаря параметров в бэкенд хранения. Это позволяет, например,
передавать учетные данные для хранилищ S3 и GCS. Подробности о том, какие
параметры можно передавать в какие бэкенды, можно найти в документации
отдельных бэкендов хранения (подробно из документации fsspec для
встроенные реализации и связан с внешние). См.
Раздел Чтение/запись удаленных файлов.
GH 35655 добавлена поддержка fsspec (включая storage_options)
для чтения файлов Excel.
Поддержка бинарных файловых дескрипторов в to_csv#
to_csv() поддерживает файловые дескрипторы в бинарном режиме (GH 19827 и GH 35058)
с encoding (GH 13068 и GH 23854) и compression (GH 22555).
Если pandas не определяет автоматически, открыт ли файловый дескриптор в бинарном или текстовом режиме,
необходимо указать mode="wb".
Например:
In [1]: import io
In [2]: data = pd.DataFrame([0, 1, 2])
In [3]: buffer = io.BytesIO()
In [4]: data.to_csv(buffer, encoding="utf-8", compression="gzip")
Поддержка короткой подписи и позиции таблицы в to_latex#
DataFrame.to_latex() теперь позволяет указать плавающую позицию таблицы (GH 35281)
и короткая подпись (GH 36267).
Ключевое слово position был добавлен для установки позиции.
In [5]: data = pd.DataFrame({'a': [1, 2], 'b': [3, 4]})
In [6]: table = data.to_latex(position='ht')
In [7]: print(table)
\begin{table}[ht]
\begin{tabular}{lrr}
\toprule
& a & b \\
\midrule
0 & 1 & 3 \\
1 & 2 & 4 \\
\bottomrule
\end{tabular}
\end{table}
Использование ключевого слова caption был расширен.
Помимо приема одной строки в качестве аргумента,
можно дополнительно предоставить кортеж (full_caption, short_caption)
добавить макрос короткой подписи.
In [8]: data = pd.DataFrame({'a': [1, 2], 'b': [3, 4]})
In [9]: table = data.to_latex(caption=('the full long caption', 'short caption'))
In [10]: print(table)
\begin{table}
\caption[short caption]{the full long caption}
\begin{tabular}{lrr}
\toprule
& a & b \\
\midrule
0 & 1 & 3 \\
1 & 2 & 4 \\
\bottomrule
\end{tabular}
\end{table}
Изменение точности по умолчанию для чисел с плавающей точкой в read_csv и read_table#
Для парсера C методы read_csv() и read_table() ранее по умолчанию использовался парсер, который
мог некорректно считывать числа с плавающей точкой относительно последнего бита точности.
Опция floating_precision="high" всегда был доступен для избежания этой проблемы.
Начиная с этой версии, по умолчанию теперь используется более точный парсер, делая
floating_precision=None соответствуют высокоточному парсеру, и новая опция
floating_precision="legacy" для использования устаревшего парсера. Переход на использование парсера с более высокой точностью по умолчанию не должен повлиять на производительность. (GH 17154)
Экспериментальные nullable типы данных для данных с плавающей точкой#
Мы добавили Float32Dtype / Float64Dtype и FloatingArray.
Это расширенные типы данных, предназначенные для данных с плавающей точкой, которые могут содержать
pd.NA индикатор пропущенного значения (GH 32265, GH 34307).
Хотя стандартный тип данных float уже поддерживает пропущенные значения с помощью np.nan,
эти новые типы данных используют pd.NA (и соответствующее ему поведение) в качестве индикатора пропущенных значений, в соответствии с уже существующими nullable целое число
и логический типы данных.
Один пример, где поведение np.nan и pd.NA отличается в
операциях сравнения:
# the default NumPy float64 dtype
In [11]: s1 = pd.Series([1.5, None])
In [12]: s1
Out[12]:
0 1.5
1 NaN
Length: 2, dtype: float64
In [13]: s1 > 1
Out[13]:
0 True
1 False
Length: 2, dtype: bool
# the new nullable float64 dtype
In [14]: s2 = pd.Series([1.5, None], dtype="Float64")
In [15]: s2
Out[15]:
0 1.5
1
Length: 2, dtype: Float64
In [16]: s2 > 1
Out[16]:
0 True
1
Length: 2, dtype: boolean
См. семантика NA раздел документации для получения дополнительных сведений о поведении
при использовании pd.NA индикатор пропущенного значения.
Как показано выше, dtype может быть указан с использованием строки "Float64" или "Float32" (с заглавной буквы, чтобы отличить от типа данных по умолчанию "float64"). Кроме того, вы также можете использовать объект dtype:
In [17]: pd.Series([1.5, None], dtype=pd.Float32Dtype())
Out[17]:
0 1.5
1
Length: 2, dtype: Float32
Операции с существующими целочисленными или булевыми nullable типами данных, которые дают результаты с плавающей точкой, теперь также будут использовать nullable типы данных с плавающей точкой (GH 38178).
Предупреждение
Экспериментально: новые типы данных с плавающей точкой в настоящее время являются экспериментальными, и их поведение или API могут еще измениться без предупреждения. Особенно поведение относительно NaN (отличного от пропущенных значений NA) может измениться.
Сохранение имени индекса/столбца при агрегировании#
При агрегировании с использованием concat() или DataFrame конструктор, pandas теперь будет пытаться сохранять имена индексов и столбцов, когда это возможно (GH 35847).
В случае, когда все входные данные имеют общее имя, это имя будет присвоено результату. Когда имена входных данных не совпадают, результат будет безымянным. Вот пример, где имя индекса сохраняется:
In [18]: idx = pd.Index(range(5), name='abc')
In [19]: ser = pd.Series(range(5, 10), index=idx)
In [20]: pd.concat({'x': ser[1:], 'y': ser[:-1]}, axis=1)
Out[20]:
x y
abc
1 6.0 6.0
2 7.0 7.0
3 8.0 8.0
4 9.0 NaN
0 NaN 5.0
[5 rows x 2 columns]
То же самое верно для MultiIndex, но логика применяется отдельно на
уровне за уровнем.
GroupBy напрямую поддерживает операции EWM#
DataFrameGroupBy теперь поддерживает операции с экспоненциально взвешенным окном напрямую (GH 16037).
In [21]: df = pd.DataFrame({'A': ['a', 'b', 'a', 'b'], 'B': range(4)})
In [22]: df
Out[22]:
A B
0 a 0
1 b 1
2 a 2
3 b 3
[4 rows x 2 columns]
In [23]: df.groupby('A').ewm(com=1.0).mean()
Out[23]:
B
A
a 0 0.000000
2 1.333333
b 1 1.000000
3 2.333333
[4 rows x 1 columns]
Кроме того mean поддерживает выполнение через Numba с
engine и engine_kwargs аргументы. Numba должна быть установлена как дополнительная зависимость для использования этой функции.
Другие улучшения#
Добавлен
day_of_week(псевдоним совместимостиdayofweek) свойство дляTimestamp,DatetimeIndex,Period,PeriodIndex(GH 9605)Добавлен
day_of_year(псевдоним совместимостиdayofyear) свойство дляTimestamp,DatetimeIndex,Period,PeriodIndex(GH 9605)Добавлен
set_flags()для установки флагов на уровне таблицы для Series или DataFrame (GH 28394)DataFrame.applymap()теперь поддерживаетna_action(GH 23803)Indexс типом object поддерживает деление и умножение (GH 34160)io.sql.get_schema()теперь поддерживаетschemaключевой аргумент, который добавит схему в оператор создания таблицы (GH 28486)DataFrame.explode()иSeries.explode()теперь поддерживают развертывание множеств (GH 35614)DataFrame.hist()теперь поддерживает данные временных рядов (datetime) (GH 32590)Styler.set_table_styles()теперь позволяет прямое стилизование строк и столбцов и может быть объединено в цепочку (GH 35607)Stylerтеперь позволяет напрямую добавлять имя CSS-класса к отдельным ячейкам данных (GH 36159)Rolling.mean()иRolling.sum()использовать суммирование Кахана для вычисления среднего, чтобы избежать числовых проблем (GH 10319, GH 11645, GH 13254, GH 32761, GH 36031)DatetimeIndex.searchsorted(),TimedeltaIndex.searchsorted(),PeriodIndex.searchsorted(), иSeries.searchsorted()с типами данных, подобными datetime, теперь будет пытаться преобразовать строковые аргументы (подобные списку и скалярные) в соответствующий тип, подобный datetime (GH 36346)Добавленные методы
IntegerArray.prod(),IntegerArray.min(), иIntegerArray.max()(GH 33790)Вызов функции NumPy ufunc на
DataFrameс типами расширений теперь сохраняет типы расширений, когда это возможно (GH 23743)Вызов бинарной функции NumPy ufunc на нескольких
DataFrameобъектов теперь выравнивается, соответствуя поведению бинарных операций и ufuncs наSeries(GH 23743). Это изменение было отменено в pandas 1.2.1, и поведение не выравнивать DataFrame вместо этого устарело, см. примечания к выпуску 1.2.1.По возможности
RangeIndex.difference()иRangeIndex.symmetric_difference()вернетRangeIndexвместоInt64Index(GH 36564)DataFrame.to_parquet()теперь поддерживаетMultiIndexдля столбцов в формате parquet (GH 34777)read_parquet()получилuse_nullable_dtypes=Trueопция использования обнуляемых типов данных, которые используютpd.NAв качестве индикатора пропущенных значений, где это возможно для результирующего DataFrame (по умолчаниюFalse, и применимо только дляengine="pyarrow") (GH 31242)Добавлен
Rolling.sem()иExpanding.sem()для вычисления стандартной ошибки среднего (GH 26476)Rolling.var()иRolling.std()использовать суммирование Кахана и метод Велфорда для избежания числовых проблем (GH 37051)DataFrame.corr()иDataFrame.cov()использовать метод Велфорда для избежания числовых проблем (GH 37448)DataFrame.plot()теперь распознаётxlabelиylabelаргументы для графиков типаscatterиhexbin(GH 37001)DataFrame.to_parquet()теперь возвращаетbytesобъект, когда нетpathпередается аргумент (GH 37105)Rollingтеперь поддерживаетclosedаргумент для фиксированных окон (GH 34315)DatetimeIndexиSeriesсdatetime64илиdatetime64tzdtypes теперь поддерживаютstd(GH 37436)Windowтеперь поддерживает все типы окон Scipy вwin_typeс поддержкой гибких аргументов ключевых слов (GH 34556)testing.assert_index_equal()теперь имеетcheck_orderпараметр, который позволяет проверять индексы независимо от порядка (GH 37478)read_csv()поддерживает отображение в память для сжатых файлов (GH 37621)Добавлена поддержка для
min_countключевое слово дляDataFrame.groupby()иDataFrame.resample()для функцийmin,max,firstиlast(GH 37821, GH 37768)Улучшить отчёт об ошибках для
DataFrame.merge()когда были даны неверные определения столбцов слияния (GH 16228)Улучшить числовую стабильность для
Rolling.skew(),Rolling.kurt(),Expanding.skew()иExpanding.kurt()через реализацию суммирования Кахана (GH 6929)Улучшено сообщение об ошибке при выборке колонок
DataFrameGroupByсaxis=1(GH 37725)Реализовать метод
crossдляDataFrame.merge()иDataFrame.join()(GH 5401)Когда
read_csv(),read_sas()иread_json()вызываются сchunksize/iteratorих можно использовать вwithоператор, так как они возвращают контекст-менеджеры (GH 38225)Расширен список именованных цветов, доступных для стилизации экспорта в Excel, включив все цвета CSS4 (GH 38247)
Значительные исправления ошибок#
Это исправления ошибок, которые могут привести к заметным изменениям в поведении.
Согласованность редукций DataFrame#
DataFrame.any() и DataFrame.all() с bool_only=True теперь определяет, исключать ли столбцы типа object на основе каждого столбца, вместо проверки, если все столбцы типа object могут считаться булевыми.
Это предотвращает патологическое поведение, когда применение редукции к подмножеству столбцов может привести к получению большего результата Series. См. (GH 37799).
In [24]: df = pd.DataFrame({"A": ["foo", "bar"], "B": [True, False]}, dtype=object)
In [25]: df["C"] = pd.Series([True, True])
Предыдущее поведение:
In [5]: df.all(bool_only=True)
Out[5]:
C True
dtype: bool
In [6]: df[["B", "C"]].all(bool_only=True)
Out[6]:
B False
C True
dtype: bool
Новое поведение:
In [26]: In [5]: df.all(bool_only=True)
Out[26]:
C True
Length: 1, dtype: bool
In [27]: In [6]: df[["B", "C"]].all(bool_only=True)
Out[27]:
C True
Length: 1, dtype: bool
Другие редукции DataFrame с numeric_only=None также позволит избежать
этого патологического поведения (GH 37827):
In [28]: df = pd.DataFrame({"A": [0, 1, 2], "B": ["a", "b", "c"]}, dtype=object)
Предыдущее поведение:
In [3]: df.mean()
Out[3]: Series([], dtype: float64)
In [4]: df[["A"]].mean()
Out[4]:
A 1.0
dtype: float64
Новое поведение:
In [3]: df.mean()
Out[3]:
A 1.0
dtype: float64
In [4]: df[["A"]].mean()
Out[4]:
A 1.0
dtype: float64
Более того, редукции DataFrame с numeric_only=None теперь будет
согласован с их аналогами Series. В частности, для
редукций, где метод Series вызывает TypeError, редукция DataFrame теперь будет считать этот столбец нечисловым вместо приведения к массиву NumPy, который может иметь другую семантику (GH 36076,
GH 28949, GH 2700).
In [29]: ser = pd.Series([0, 1], dtype="category", name="A")
In [30]: df = ser.to_frame()
Предыдущее поведение:
In [5]: df.any()
Out[5]:
A True
dtype: bool
Новое поведение:
In [5]: df.any()
Out[5]: Series([], dtype: bool)
Повышена минимальная версия Python#
pandas 1.2.0 поддерживает Python 3.7.1 и выше (GH 35214).
Повышенные минимальные версии для зависимостей#
Некоторые минимальные поддерживаемые версии зависимостей были обновлены (GH 35214). Если установлено, теперь требуется:
Пакет |
Минимальная версия |
Обязательно |
Изменено |
|---|---|---|---|
numpy |
1.16.5 |
X |
X |
pytz |
2017.3 |
X |
X |
python-dateutil |
2.7.3 |
X |
|
bottleneck |
1.2.1 |
||
numexpr |
2.6.8 |
X |
|
pytest (разработка) |
5.0.1 |
X |
|
mypy (dev) |
0.782 |
X |
Для дополнительные библиотеки общая рекомендация — использовать последнюю версию. Следующая таблица перечисляет минимальную версию для каждой библиотеки, которая в настоящее время тестируется в ходе разработки pandas. Опциональные библиотеки ниже минимальной тестируемой версии могут всё ещё работать, но не считаются поддерживаемыми.
Пакет |
Минимальная версия |
Изменено |
|---|---|---|
beautifulsoup4 |
4.6.0 |
|
fastparquet |
0.3.2 |
|
fsspec |
0.7.4 |
|
gcsfs |
0.6.0 |
|
lxml |
4.3.0 |
X |
matplotlib |
2.2.3 |
X |
numba |
0.46.0 |
|
openpyxl |
2.6.0 |
X |
pyarrow |
0.15.0 |
X |
pymysql |
0.7.11 |
X |
pytables |
3.5.1 |
X |
s3fs |
0.4.0 |
|
scipy |
1.2.0 |
|
sqlalchemy |
1.2.8 |
X |
xarray |
0.12.3 |
X |
xlrd |
1.2.0 |
X |
xlsxwriter |
1.0.2 |
X |
xlwt |
1.3.0 |
X |
pandas-gbq |
0.12.0 |
См. Зависимости и Необязательные зависимости подробнее.
Другие изменения API#
Сортировка в порядке убывания теперь стабильна для
Series.sort_values()иIndex.sort_values()для Datetime-подобныхIndex-2.774848Index.sort_values(). При использованииSeries.value_counts()количество пропущенных значений больше не обязательно является последним в списке подсчётов дубликатов. Вместо этого его позиция соответствует позиции в исходном Series. При использованииIndex.sort_values()для Datetime-подобныхIndexподклассы, NaT игнорировалиna_positionаргумента и сортировались в начало. Теперь они учитываютna_position, по умолчаниюlast, так же, как другиеIndexподклассы (GH 35992)Передача недопустимого
fill_valuetoCategorical.take(),DatetimeArray.take(),TimedeltaArray.take(), илиPeriodArray.take()теперь вызываетTypeErrorвместоValueError(GH 37733)Передача недопустимого
fill_valuetoSeries.shift()сCategoricalDtypeтеперь вызываетTypeErrorвместоValueError(GH 37733)Передача недопустимого значения в
IntervalIndex.insert()илиCategoricalIndex.insert()теперь вызываетTypeErrorвместоValueError(GH 37733)Попытка переиндексировать Series с
CategoricalIndexс невалиднымfill_valueтеперь вызываетTypeErrorвместоValueError(GH 37733)CategoricalIndex.append()с индексом, содержащим некатегориальные значения, теперь будет преобразовывать вместо вызова ошибкиTypeError(GH 38098)
Устаревшие функции#
Устаревший параметр
inplaceвMultiIndex.set_codes()иMultiIndex.set_levels()(GH 35626)Устаревший параметр
dtypeметодаcopy()для всехIndexподклассы. Используйтеastype()метод вместо изменения типа данных (GH 35853)Устаревшие параметры
levelsиcodesвMultiIndex.copy(). Используйтеset_levels()иset_codes()методы вместо (GH 36685)Функции парсинга дат
parse_date_time(),parse_date_fields(),parse_all_fields()иgeneric_parser()изpandas.io.date_convertersустарели и будут удалены в будущей версии; используйтеto_datetime()вместо (GH 35741)DataFrame.lookup()устарел и будет удален в будущей версии, используйтеDataFrame.melt()иDataFrame.loc()вместо (GH 35224)Метод
Index.to_native_types()устарел. Используйте.astype(str)вместо (GH 28867)Устаревшая индексация
DataFrameстроки с одной строкой даты-времени какdf[string](учитывая неоднозначность, индексирует ли он строки или выбирает столбец), используйтеdf.loc[string]вместо (GH 36179)Устаревший
Index.is_all_dates()(GH 27744)Значение по умолчанию для
regexдляSeries.str.replace()изменится сTruetoFalseв будущем релизе. Кроме того, регулярные выражения из одного символа будут не обрабатываются как строковые литералы, когдаregex=Trueустановлен (GH 24804)Устаревшее автоматическое выравнивание при операциях сравнения между
DataFrameиSeries, сделайтеframe, ser = frame.align(ser, axis=1, copy=False)перед, например,frame == ser(GH 28759)Rolling.count()сmin_periods=Noneпо умолчанию будет равен размеру окна в будущей версии (GH 31302)Использование "внешних" ufunc на DataFrames для возврата 4d ndarray теперь устарело. Сначала преобразуйте в ndarray (GH 23743)
Устаревшее срезовое индексирование для tz-aware
DatetimeIndexс наивнымиdatetimeобъекты, чтобы соответствовать поведению скалярного индексирования (GH 36148)Index.ravel()возвращаяnp.ndarrayустарел, в будущем это будет возвращать представление того же индекса (GH 19956)Устарело использование строк, обозначающих единицы измерения с 'M', 'Y' или 'y' в
to_timedelta()(GH 36666)Indexметоды&,|, и^ведущий себя как операции над множествамиIndex.intersection(),Index.union(), иIndex.symmetric_difference(), соответственно, устарели и в будущем будут вести себя как поэлементные булевы операции, соответствующиеSeriesповедение. Вместо этого используйте именованные методы множеств (GH 36758)Categorical.is_dtype_equal()иCategoricalIndex.is_dtype_equal()устарели, будут удалены в будущей версии (GH 37545)Series.slice_shift()иDataFrame.slice_shift()устарели, используйтеSeries.shift()илиDataFrame.shift()вместо (GH 37601)Частичная выборка на неупорядоченных
DatetimeIndexобъектов с ключами, которых нет в индексе, устарело и будет удалено в будущей версии (GH 18531)The
howключевое слово вPeriodIndex.astype()устарел и будет удален в будущей версии, используйтеindex.to_timestamp(how=how)вместо (GH 37982)Устаревший
Index.asi8()дляIndexподклассы, отличные отDatetimeIndex,TimedeltaIndex, иPeriodIndex(GH 37877)The
inplaceпараметрCategorical.remove_unused_categories()устарел и будет удален в будущей версии (GH 37643)The
null_countsпараметрDataFrame.info()устарел и заменён наshow_counts. Он будет удален в будущей версии (GH 37999)
Вызов функций NumPy ufuncs на невыровненных DataFrame
Вызов функций NumPy ufunc для невыровненных DataFrames изменил поведение в pandas 1.2.0 (чтобы выровнять входные данные перед вызовом ufunc), но это изменение отменено в pandas 1.2.1. Поведение без выравнивания теперь устарело, см. примечания к выпуску 1.2.1 для более подробной информации.
Улучшения производительности#
Улучшения производительности при создании DataFrame или Series с dtype
strилиStringDtypeиз массива со многими строковыми элементами (GH 36304, GH 36317, GH 36325, GH 36432, GH 37371)Улучшение производительности в
DataFrameGroupBy.agg()иSeriesGroupBy.agg()сnumbaдвижок (GH 35759)Улучшения производительности при создании
Series.map()из огромного словаря (GH 34717)Улучшение производительности в
DataFrameGroupBy.transform()иSeriesGroupBy.transform()сnumbaдвижок (GH 36240)Stylerметод uuid изменён для сжатия передачи данных через веб при сохранении достаточно низкой вероятности коллизии таблиц (GH 36345)Улучшение производительности в
to_datetime()с единицей времени, отличной от наносекунд, дляfloatdtypeстолбцы (GH 20445)Улучшение производительности при установке значений на
IntervalArray(GH 36310)Внутренний метод индекса
_shallow_copy()теперь делает так, что новый индекс и исходный индекс используют общие кэшированные атрибуты, избегая их повторного создания, если они созданы на любом из них. Это может ускорить операции, зависящие от создания копий существующих индексов (GH 36840)Улучшение производительности в
RollingGroupby.count()(GH 35625)Небольшое снижение производительности для
Rolling.min()иRolling.max()для фиксированных окон (GH 36567)Снижено пиковое использование памяти в
DataFrame.to_pickle()при использованииprotocol=5в python 3.8+ (GH 34244)Быстрее
dirвызовы, когда объект имеет много меток индекса, напримерdir(ser)(GH 37450)Улучшение производительности в
ExpandingGroupby(GH 37064)Улучшение производительности в
Series.astype()иDataFrame.astype()дляCategorical(GH 8628)Улучшение производительности в
DataFrame.groupby()дляfloatdtype(GH 28303), изменения базовой хэш-функции могут привести к изменениям в порядке сортировки индексов на основе float для совпадений (например,Index.value_counts())Улучшение производительности в
pd.isin()для входных данных с более чем 1e6 элементов (GH 36611)Улучшение производительности для
DataFrame.__setitem__()с индексаторами в виде списка (GH 37954)read_json()теперь избегает чтения всего файла в память, когда указан chunksize (GH 34548)
Исправления ошибок#
Категориальный#
Categorical.fillna()всегда будет возвращать копию, проверять переданное значение заполнения независимо от наличия NA для заполнения и запрещатьNaTв качестве заполняющего значения для числовых категорий (GH 36530)Ошибка в
Categorical.__setitem__()который некорректно вызывался при попытке установить кортежное значение (GH 20439)Ошибка в
CategoricalIndex.equals()неправильное приведение некатегориальных записей кnp.nan(GH 37667)Ошибка в
CategoricalIndex.where()неправильная установка некатегориальных записей вnp.nanвместо вызова исключенияTypeError(GH 37977)Ошибка в
Categorical.to_numpy()иnp.array(categorical)с учетом часового поясаdatetime64категории некорректно удаляют информацию о часовом поясе вместо приведения к типу object (GH 38136)
Datetime-подобный#
Ошибка в
DataFrame.combine_first()который преобразует столбец с датой-временем в другихDataFrameв целое число, когда столбец отсутствует в исходномDataFrame(GH 28481)Ошибка в
DatetimeArray.dateгдеValueErrorбудет вызвано с массивом только для чтения (GH 33530)Ошибка в
NaTсравнения не вызывалиTypeErrorпри некорректных сравнениях неравенства (GH 35046)Ошибка в
DateOffsetгде атрибуты, восстановленные из файлов pickle, отличаются от исходных объектов, когда входные значения превышают нормальные диапазоны (например, months=12) (GH 34511)Ошибка в
DatetimeIndex.get_slice_bound()гдеdatetime.dateобъекты не принимались или были наивнымиTimestampс tz-awareDatetimeIndex(GH 35690)Ошибка в
DatetimeIndex.slice_locs()гдеdatetime.dateобъекты не принимались (GH 34077)Ошибка в
DatetimeIndex.searchsorted(),TimedeltaIndex.searchsorted(),PeriodIndex.searchsorted(), иSeries.searchsorted()сdatetime64,timedelta64илиPeriodразмещение типа данныхNaTзначения несовместимы с NumPy (GH 36176, GH 36254)Несогласованность в
DatetimeArray,TimedeltaArray, иPeriodArrayметод__setitem__преобразование массивов строк в скаляры, похожие на дату/время, но не скалярные строки (GH 36261)Ошибка в
DatetimeArray.take()некорректно разрешаяfill_valueс несовпадающим часовым поясом (GH 37356)Ошибка в
DatetimeIndex.shiftнеправильное возбуждение при сдвиге пустых индексов (GH 14811)TimestampиDatetimeIndexсравнения между объектами с часовым поясом и без него теперь следуют стандартной библиотекеdatetimeповедение, возвращаяTrue/Falseдля!=/==и вызов исключения для сравнений на неравенство (GH 28507)Ошибка в
DatetimeIndex.equals()иTimedeltaIndex.equals()неправильно рассматриваяint64индексы как равные (GH 36744)Series.to_json(),DataFrame.to_json(), иread_json()теперь реализует парсинг часовых поясов, когда структура ориентацииtable(GH 35973)astype()теперь пытается преобразовать вdatetime64[ns, tz]непосредственно изobjectс выведенным часовым поясом из строки (GH 35973)Ошибка в
TimedeltaIndex.sum()иSeries.sum()сtimedelta64dtype для пустого индекса или серии возвращаетNaTвместоTimedelta(0)(GH 31751)Ошибка в
DatetimeArray.shift()некорректно разрешаяfill_valueс несовпадающим часовым поясом (GH 37299)Ошибка при добавлении
BusinessDayс ненулевымoffsetв нескалярный другой (GH 37457)Ошибка в
to_datetime()с массивом только для чтения, некорректно вызывающим (GH 34857)Ошибка в
Series.isin()сdatetime64[ns]dtype иDatetimeIndex.isin()некорректное приведение целых чисел к датам и времени (GH 36621)Ошибка в
Series.isin()сdatetime64[ns]dtype иDatetimeIndex.isin()не учитывая, что tz-aware и tz-naive дата-время всегда различны (GH 35728)Ошибка в
Series.isin()сPeriodDtypedtype иPeriodIndex.isin()не учитывая аргументы с разнымиPeriodDtypeкак всегда разные (GH 37528)Ошибка в
Periodконструктор теперь корректно обрабатывает наносекунды вvalueаргумент (GH 34621 и GH 17053)
Timedelta#
Ошибка в
TimedeltaIndex,Series, иDataFrameцелочисленное деление сtimedelta64типы данных иNaTв знаменателе (GH 35529)Ошибка в разборе длительностей ISO 8601 в
Timedeltaиto_datetime()(GH 29773, GH 36204)Ошибка в
to_timedelta()с массивом только для чтения, некорректно вызывающим (GH 34857)Ошибка в
Timedeltaнеправильное обрезание до субсекундной части строкового ввода, когда точность выше наносекунд (GH 36738)
Часовые пояса#
Ошибка в
date_range()вызывалAmbiguousTimeErrorдля корректного ввода сambiguous=False(GH 35297)Ошибка в
Timestamp.replace()терял информацию о фолде (GH 37610)
Числовой#
Ошибка в
to_numeric()где точность чисел с плавающей точкой была некорректной (GH 31364)Ошибка в
DataFrame.any()сaxis=1иbool_only=Trueигнорируяbool_onlyключевое слово (GH 32432)Ошибка в
Series.equals()гдеValueErrorвозникало при сравнении массивов NumPy со скалярами (GH 35267)Ошибка в
Seriesгде два Series имеютDatetimeIndexс разными часовыми поясами, имеющими эти индексы, некорректно изменялись при выполнении арифметических операций (GH 33671)Ошибка в
pandas.testingфункции модуля при использовании сcheck_exact=Falseдля комплексных числовых типов (GH 28235)Ошибка в
DataFrame.__rmatmul__()обработка ошибок, сообщающая о транспонированных формах (GH 21581)Ошибка в
Seriesгибкие арифметические методы, где результат при работе сlist,tupleилиnp.ndarrayбудет иметь некорректное имя (GH 36760)Ошибка в
IntegerArrayумножение наtimedeltaиnp.timedelta64объекты (GH 36870)Ошибка в
MultiIndexсравнение с кортежем, некорректно обрабатывающее кортеж как массивоподобный объект (GH 21517)Ошибка в
DataFrame.diff()сdatetime64типы данных, включаяNaTзначения, которые не удалось заполнитьNaTрезультаты корректны (GH 32441)Ошибка в
DataFrameарифметические операции некорректно принимали аргументы ключевых слов (GH 36843)Ошибка в
IntervalArrayсравнения сSeriesне возвращает Series (GH 36908)Ошибка в
DataFrameразрешая арифметические операции со списком массивоподобных объектов с неопределёнными результатами. Поведение изменено на вызов исключенияValueError(GH 36702)Ошибка в
DataFrame.std()сtimedelta64dtype иskipna=False(GH 37392)Ошибка в
DataFrame.min()иDataFrame.max()сdatetime64dtype иskipna=False(GH 36907)Ошибка в
DataFrame.idxmax()иDataFrame.idxmin()со смешанными типами данных, некорректно вызываяTypeError(GH 38195)
Преобразование#
Ошибка в
DataFrame.to_dict()сorient='records'теперь возвращает нативные объекты datetime Python для столбцов типа datetime (GH 21256)Ошибка в
Series.astype()преобразование изstringtofloatКогда True, выводит и разбирает даты с днём первым, например 20/01/2005 [по умолчанию: False] [в настоящее время: False]pd.NAзначения (GH 37626)
Строки#
Ошибка в
Series.to_string(),DataFrame.to_string(), иDataFrame.to_latex()добавление ведущего пробела приindex=False(GH 24980)Ошибка в
to_numeric()вызовTypeErrorпри попытке преобразовать Series строкового типа данных, содержащий только числовые строки иNA(GH 37262)
Interval#
Ошибка в
DataFrame.replace()иSeries.replace()гдеIntervalтипы данных будут преобразованы в типы данных object (GH 34871)Ошибка в
IntervalIndex.take()с отрицательными индексами иfill_value=None(GH 37330)Ошибка в
IntervalIndex.putmask()неправильное приведение datetime-like dtype к object dtype (GH 37968)Ошибка в
IntervalArray.astype()некорректное удаление информации о типе данных сCategoricalDtypeобъект (GH 37984)
Индексирование#
Ошибка в
PeriodIndex.get_loc()некорректное возбуждениеValueErrorна недатовых строках вместоKeyError, вызывая аналогичные ошибки вSeries.__getitem__(),Series.__contains__(), иSeries.loc.__getitem__()(GH 34240)Ошибка в
Index.sort_values()где при передаче пустых значений метод ломался, пытаясь сравнить пропущенные значения вместо их перемещения в конец порядка сортировки (GH 35584)Ошибка в
Index.get_indexer()иIndex.get_indexer_non_unique()гдеint64массивы возвращаются вместоintp(GH 36359)Ошибка в
DataFrame.sort_index()где параметр ascending, переданный как список для одноуровневого индекса, даёт неверный результат (GH 32334)Ошибка в
DataFrame.reset_index()некорректно вызывалValueErrorдля входных данных сMultiIndexс пропущенными значениями на уровне сCategoricalтип данных (GH 24206)Ошибка при индексировании с булевыми масками на значениях типа datetime, иногда возвращающая представление вместо копии (GH 36210)
Ошибка в
DataFrame.__getitem__()иDataFrame.loc.__getitem__()сIntervalIndexстолбцы и числовой индексатор (GH 26490)Ошибка в
Series.loc.__getitem__()с неуникальнымMultiIndexи пустой индекс-список (GH 13691)Ошибка при индексации на
SeriesилиDataFrameсMultiIndexи уровень с именем"0"(GH 37194)Ошибка в
Series.__getitem__()при использовании массива беззнаковых целых чисел в качестве индексатора, дающего некорректные результаты или сегфолт вместо вызоваKeyError(GH 37218)Ошибка в
Index.where()неправильное приведение числовых значений к строкам (GH 37591)Ошибка в
DataFrame.loc()возвращает пустой результат, когда индексатор является срезом с отрицательным шагом (GH 38071)Ошибка в
Series.loc()иDataFrame.loc()вызывает, когда индекс былobjectтип данных и заданная числовая метка была в индексе (GH 26491)Ошибка в
DataFrame.loc()возвращал запрошенный ключ плюс пропущенные значения, когдаlocбыл применён к одному уровню изMultiIndex(GH 27104)Ошибка при индексации на
SeriesилиDataFrameсCategoricalIndexиспользуя индексный объект, подобный списку, содержащий значения NA (GH 37722)Ошибка в
DataFrame.loc.__setitem__()расширение пустогоDataFrameсо смешанными типами данных (GH 37932)Ошибка в
DataFrame.xs()игнорируетсяdroplevel=Falseдля столбцов (GH 19056)Ошибка в
DataFrame.reindex()вызовIndexingErrorнеправильно для пустого DataFrame сtoleranceнеNoneилиmethod="nearest"(GH 27315)Ошибка при индексации на
SeriesилиDataFrameсCategoricalIndexиспользуя индексный указатель типа списка, содержащий элементы, которые находятся в индексеcategoriesно не в самом индексе, не вызываяKeyError(GH 37901)Ошибка при вставке булевой метки в
DataFrameс числовымIndexстолбцы некорректно приводятся к целому числу (GH 36319)Ошибка в
DataFrame.iloc()иSeries.iloc()выравнивание объектов в__setitem__(GH 22046)Ошибка в
MultiIndex.drop()не вызывает ошибку, если метки найдены частично (GH 37820)Ошибка в
DataFrame.loc()не вызывалKeyErrorкогда отсутствующая комбинация была задана сslice(None)для оставшихся уровней (GH 19556)Ошибка в
DataFrame.loc()вызовTypeErrorкогда нецелочисленный срез был передан для выбора значений изMultiIndex(GH 25165, GH 24263)Ошибка в
Series.at()возвращаяSeriesс одним элементом вместо скаляра, когда индекс являетсяMultiIndexс одним уровнем (GH 38053)Ошибка в
DataFrame.loc()возврат и присвоение элементов в неправильном порядке, когда индексатор упорядочен иначе, чемMultiIndexдля фильтрации (GH 31330, GH 34603)Ошибка в
DataFrame.loc()иDataFrame.__getitem__()вызовKeyErrorкогда столбцы былиMultiIndexтолько с одним уровнем (GH 29749)Ошибка в
Series.__getitem__()иDataFrame.__getitem__()вызывая пустойKeyErrorбез пропущенных ключей дляIntervalIndex(GH 27365)Если DataFrame пуст, возвращает None.
DataFrameилиSeriesсCategoricalIndexнекорректное возбуждениеTypeErrorкогда новая метка не входит в категории индекса (GH 38098)Ошибка в
Series.loc()иSeries.iloc()вызовValueErrorпри вставке списко-подобногоnp.array,listилиtupleвobjectSeries одинаковой длины (GH 37748, GH 37486)Ошибка в
Series.loc()иSeries.iloc()установка всех значенийobjectSeries с элементами спискаExtensionArrayвместо вставки (GH 38271)
Отсутствует#
Ошибка в
SeriesGroupBy.transform()теперь корректно обрабатывает пропущенные значения дляdropna=False(GH 35014)Ошибка в
Series.nunique()сdropna=Trueвозвращал некорректные результаты, когда обаNAиNoneотсутствующие значения присутствовали (GH 37566)Ошибка в
Series.interpolate()где аргументlimit_areaиlimit_directionне имел эффекта при использовании методовpadиbackfill(GH 31048)
MultiIndex#
Ошибка в
DataFrame.xs()при использовании сIndexSliceвызываетTypeErrorс сообщением"Expected label or tuple of labels"(GH 35301)Ошибка в
DataFrame.reset_index()сNaTзначения в индексе вызываютValueErrorс сообщением"cannot convert float NaN to integer"(GH 36541)Ошибка в
DataFrame.combine_first()при использовании сMultiIndexсодержащий строку иNaNзначения вызываетTypeError(GH 36562)Ошибка в
MultiIndex.drop()удаленоNaNзначения, когда несуществующий ключ был указан на входе (GH 18853)Ошибка в
MultiIndex.drop()удаление большего количества значений, чем ожидалось, когда индекс имеет дубликаты и не отсортирован (GH 33494)
I/O#
read_sas()больше не утекают ресурсы при сбое (GH 35566)Ошибка в
DataFrame.to_csv()иSeries.to_csv()вызвалValueErrorкогда он вызывался с именем файла в комбинации сmodeсодержащийb(GH 35058)Ошибка в
read_csv()сfloat_precision='round_trip'не обрабатывалdecimalиthousandsпараметры (GH 35365)to_pickle()иread_pickle()закрывали предоставленные пользователем файловые объекты (GH 35679)to_csv()передаёт аргументы сжатия для'gzip'всегда вgzip.GzipFile(GH 28103)to_csv()не поддерживал zip-сжатие для бинарного файлового объекта без имени файла (GH 35058)to_csv()иread_csv()не учитывалcompressionиencodingдля объектов, подобных пути, которые внутренне преобразуются в объекты, подобные файлам (GH 35677, GH 26124, GH 32392)DataFrame.to_pickle(),Series.to_pickle(), иread_pickle()не поддерживал сжатие для файловых объектов (GH 26237, GH 29054, GH 29570)Ошибка в
LongTableBuilder.middle_separator()дублировал записи LaTeX longtable в Списке таблиц документа LaTeX (GH 34360)Ошибка в
read_csv()сengine='python'усечение данных, если несколько элементов присутствуют в первой строке и первый элемент начинается с BOM (GH 36343)Удалено
private_keyиverboseизread_gbq()поскольку они больше не поддерживаются вpandas-gbq(GH 34654, GH 30200)Повышена минимальная версия pytables до 3.5.1, чтобы избежать
ValueErrorвread_hdf()(GH 24839)Ошибка в
read_table()иread_csv()когдаdelim_whitespace=Trueиsep=default(GH 36583)Ошибка в
DataFrame.to_json()иSeries.to_json()при использовании сlines=Trueиorient='records'последняя строка записи не дополняется символом 'новой строки' (GH 36888)Ошибка в
read_parquet()с фиксированными часовыми поясами. Строковое представление часовых поясов не распознавалось (GH 35997, GH 36004)Ошибка в
DataFrame.to_html(),DataFrame.to_string(), иDataFrame.to_latex()игнорируяna_repаргумент, когдаfloat_formatтакже был указан (GH 9046, GH 13828)Ошибка в отображении комплексных чисел, показывающая слишком много конечных нулей (GH 36799)
Ошибка в
HDFStoreвыбрасывал исключениеTypeErrorпри экспорте пустого DataFrame сdatetime64[ns, tz]типы данных с фиксированным хранилищем HDF5 (GH 20594)Ошибка в
HDFStoreудалял информацию о часовом поясе при экспорте Series сdatetime64[ns, tz]типы данных с фиксированным хранилищем HDF5 (GH 20594)read_csv()закрывал предоставленные пользователем бинарные файловые дескрипторы, когдаengine="c"иencodingбыл запрошен (GH 36980)Ошибка в
DataFrame.to_hdf()не удалял пропущенные строки сdropna=True(GH 35719)Ошибка в
read_html()вызывалTypeErrorпри предоставленииpathlib.Pathаргумент дляioпараметр (GH 37705)DataFrame.to_excel(),Series.to_excel(),DataFrame.to_markdown(), иSeries.to_markdown()теперь поддерживают запись в URL-адреса fsspec, такие как S3 и Google Cloud Storage (GH 33987)Ошибка в
read_fwf()сskip_blank_lines=Trueне пропускал пустые строки (GH 37758)Разбор отсутствующих значений с использованием
read_json()сdtype=FalsetoNaNвместоNone(GH 28501)read_fwf()определял сжатие с помощьюcompression=Noneчто не было согласовано с другимиread_*функции (GH 37909)DataFrame.to_html()игнорировалformattersаргумент дляExtensionDtypeстолбцы (GH 36525)Минимальная версия xarray повышена до 0.12.3, чтобы избежать ссылки на удалённый
Panelкласс (GH 27101, GH 37983)DataFrame.to_csv()повторно открывал файлоподобные дескрипторы, которые также реализуютos.PathLike(GH 38125)Ошибка в преобразовании срезанного
pyarrow.Tableс пропущенными значениями в DataFrame (GH 38525)Ошибка в
read_sql_table()вызовsqlalchemy.exc.OperationalErrorкогда имена столбцов содержали знак процента (GH 37517)
Period#
Ошибка в
DataFrame.replace()иSeries.replace()гдеPeriodтипы данных будут преобразованы в типы данных object (GH 34871)
Построение графиков#
Ошибка в
DataFrame.plot()поворачивал метки оси X, когдаsubplots=True, даже если ось x не была нерегулярным временным рядом (GH 29460)Ошибка в
DataFrame.plot()где буква маркера вstyleключевое слово иногда вызывалоValueError(GH 21003)Ошибка в
DataFrame.plot.bar()иSeries.plot.bar()где позиции меток назначались по порядку значений вместо использования фактического значения для числовых или умного упорядочивания для строк (GH 26186, GH 11465). Это исправление было отменено в pandas 1.2.1, см. Что нового в версии 1.2.1 (20 января 2021)Сдвоенные оси теряли свои метки делений, что должно происходить только со всеми, кроме последней строки или столбца 'внешне' общих осей (GH 33819)
Ошибка в
Series.plot()иDataFrame.plot()выбрасывал исключениеValueErrorкогда Series или DataFrame был проиндексирован с помощьюTimedeltaIndexс фиксированной частотой, и нижний предел оси x был больше верхнего предела (GH 37454)Ошибка в
DataFrameGroupBy.boxplot()когдаsubplots=FalseвызоветKeyError(GH 16748)Ошибка в
DataFrame.plot()иSeries.plot()перезаписывал общее поведение осей y matplotlib, когда нетshareyпараметр был передан (GH 37942)Ошибка в
DataFrame.plot()вызывалTypeErrorсExtensionDtypeстолбцы (GH 32073)
Styler#
Ошибка в
Styler.render()HTML генерировался некорректно из-за ошибки форматирования вrowspanатрибут теперь соответствует синтаксису w3 (GH 38234)
Groupby/resample/rolling#
Ошибка в
DataFrameGroupBy.count()иSeriesGroupBy.sum()возвращаяNaNдля отсутствующих категорий при группировке по несколькимCategoricals. Теперь возвращается0(GH 35028)Ошибка в
DataFrameGroupBy.apply()что иногда вызывало ошибочноеValueErrorесли ось группировки имела повторяющиеся записи (GH 16646)Ошибка в
DataFrame.resample()который бы выбрасывалValueErrorпри ресемплинге из"D"to"24H"при переходе на летнее время (DST) (GH 35219)Ошибка при комбинировании методов
DataFrame.groupby()сDataFrame.resample()иDataFrame.interpolate()вызовTypeError(GH 35325)Ошибка в
DataFrameGroupBy.apply()где не-вспомогательный столбец группировки будет удален из выходных столбцов, если другой метод groupby был вызван до.apply(GH 34656)Ошибка при выборке столбцов на
DataFrameGroupBy(например,df.groupby('a')[['b']])) сбросил бы атрибутыaxis,dropna,group_keys,level,mutated,sort, иsqueezeк их значениям по умолчанию (GH 9959)Ошибка в
DataFrameGroupBy.tshift()не удалось вызватьValueErrorкогда частота не может быть выведена для индекса группы (GH 35937)Ошибка в
DataFrame.groupby()не всегда сохраняет имя индекса столбца дляany,all,bfill,ffill,shift(GH 29764)Ошибка в
DataFrameGroupBy.apply()вызов ошибки сnp.nanгруппа(ы) когдаdropna=False(GH 35889)Ошибка в
Rolling.sum()возвращал неверные значения, когда типы данных смешивались между float и integer, иaxis=1(GH 20649, GH 35596)Ошибка в
Rolling.count()возвращёнnp.nanсFixedForwardWindowIndexerкак окно,min_periods=0и только пропущенные значения в окне (GH 35579)Ошибка, где
Rollingсоздает некорректные размеры окон при использованииPeriodIndex(GH 34225)Ошибка в
DataFrameGroupBy.ffill()иDataFrameGroupBy.bfill()гдеNaNгруппа возвращала заполненные значения вместоNaNкогдаdropna=True(GH 34725)Ошибка в
RollingGroupby.count()гдеValueErrorбыло вызвано при указанииclosedпараметр (GH 35869)Ошибка в
DataFrameGroupBy.rolling()возвращение неправильных значений с частичным центрированным окном (GH 36040)Ошибка в
DataFrameGroupBy.rolling()возвращал неверные значения с временным окном, содержащимNaN. Вызывает исключениеValueErrorпоскольку окна теперь не монотонны (GH 34617)Ошибка в
Rolling.__iter__()гдеValueErrorне вызывалось, когдаmin_periodsбыл больше, чемwindow(GH 37156)Используя
Rolling.var()вместоRolling.std()избегает числовых проблем дляRolling.corr()когдаRolling.var()все еще находится в пределах точности с плавающей запятой, в то время какRolling.std()не является (GH 31286)Ошибка в
DataFrameGroupBy.quantile()иResampler.quantile()вызваноTypeErrorкогда значения были типаTimedelta(GH 29485)Ошибка в
Rolling.median()иRolling.quantile()возвращал неверные значения дляBaseIndexerподклассы с немонотонными начальными или конечными точками для окон (GH 37153)Ошибка в
DataFrame.groupby()удаленоnanгруппы из результата сdropna=Falseпри группировке по одному столбцу (GH 35646, GH 35542)Ошибка в
DataFrameGroupBy.head(),DataFrameGroupBy.tail(),SeriesGroupBy.head(), иSeriesGroupBy.tail()вызывало ошибку при использовании сaxis=1(GH 9772)Ошибка в
DataFrameGroupBy.transform()вызывало ошибку при использовании сaxis=1и ядро преобразования (например, "shift") (GH 36308)Ошибка в
DataFrameGroupBy.resample()используя.aggс sum давал другой результат, чем просто вызов.sum(GH 33548)Ошибка в
DataFrameGroupBy.apply()удалённые значения наnanгруппа при возврате тех же осей с исходным фреймом (GH 38227)Ошибка в
DataFrameGroupBy.quantile()не мог обработать arraylikeqпри группировке по столбцам (GH 33795)Ошибка в
DataFrameGroupBy.rank()сdatetime64tzили тип периода неправильно приводят результаты к этим типам данных вместо возвратаfloat64тип данных (GH 38187)
Изменение формы#
Ошибка в
DataFrame.crosstab()возвращал некорректные результаты на входных данных с повторяющимися именами строк, повторяющимися именами столбцов или повторяющимися именами между метками строк и столбцов (GH 22529)Ошибка в
DataFrame.pivot_table()сaggfunc='count'илиaggfunc='sum'возвращаяNaNдля отсутствующих категорий при сводке поCategorical. Теперь возвращается0(GH 31422)Ошибка в
concat()иDataFrameконструктор, в котором имена входных индексов не сохраняются в некоторых случаях (GH 13475)Ошибка в функции
crosstab()при использовании нескольких столбцов сmargins=Trueиnormalize=True(GH 35144)Ошибка в
DataFrame.stack()где пустой DataFrame.stack вызывал бы ошибку (GH 36113). Теперь возвращает пустой Series с пустым MultiIndex.Ошибка в
Series.unstack(). Теперь Series с одним уровнем Index при попытке развернуть будет вызыватьValueError(GH 36113)Ошибка в
DataFrame.agg()сfunc={'name':некорректное возбуждение} TypeErrorкогдаDataFrame.columns==['Name'](GH 36212)Ошибка в
Series.transform()даст некорректные результаты или вызовет ошибку, когда аргументfuncбыл словарём (GH 35811)Ошибка в
DataFrame.pivot()не сохранилMultiIndexимена уровней для столбцов, когда строки и столбцы оба являются мультииндексированными (GH 36360)Ошибка в
DataFrame.pivot()измененоindexаргумент, когдаcolumnsбыл передан, ноvaluesне было (GH 37635)Ошибка в
DataFrame.join()возвращал недетерминированный порядок уровней для результирующегоMultiIndex(GH 36910)Ошибка в
DataFrame.combine_first()вызвало неправильное выравнивание с типом данныхstringи один уровеньMultiIndexсодержащий толькоNA(GH 37591)Исправлена регрессия в
merge()по слияниюDatetimeIndexс пустым DataFrame (GH 36895)Ошибка в
DataFrame.apply()не устанавливая индекс возвращаемого значения, когдаfuncтип возвращаемого значенияdict(GH 37544)Ошибка в
DataFrame.merge()иpandas.merge()возвращая несогласованную сортировку в результате дляhow=rightиhow=left(GH 35382)Ошибка в
merge_ordered()не мог обрабатывать списокоподобныеleft_byилиright_by(GH 35269)Ошибка в
merge_ordered()возвращал неправильный результат соединения, когда длинаleft_byилиright_byравно строкамleftилиright(GH 38166)Ошибка в
merge_ordered()не вызывал исключение, когда элементы вleft_byилиright_byне существует вleftстолбцы илиrightстолбцы (GH 38167)Ошибка в
DataFrame.drop_duplicates()не проверяет bool dtype дляignore_indexключевое слово (GH 38274)
ExtensionArray#
Исправлена ошибка, где
DataFrameстолбец, установленный в скалярный тип расширения через dict-инициализацию, считался типом object, а не типом расширения (GH 35965)Исправлена ошибка, где
astype()с одинаковым dtype иcopy=Falseвернул бы новый объект (GH 28488)Исправлена ошибка при применении функции NumPy ufunc с несколькими выходами к
IntegerArrayвозвращаяNone(GH 36913)Исправлена несоответствие в
PeriodArray’s__init__сигнатуру к тем изDatetimeArrayиTimedeltaArray(GH 37289)Редукции для
BooleanArray,Categorical,DatetimeArray,FloatingArray,IntegerArray,PeriodArray,TimedeltaArray, иPandasArrayтеперь являются методами только с ключевыми словами (GH 37541)Исправлена ошибка, где
TypeErrorошибочно вызывалось, если проверка принадлежности выполнялась наExtensionArrayсодержащий nan-подобные значения (GH 37867)
Другие#
Ошибка в
DataFrame.replace()иSeries.replace()некорректно вызывалAssertionErrorвместоValueErrorкогда передаются недопустимые комбинации параметров (GH 36045)Ошибка в
DataFrame.replace()иSeries.replace()с числовыми значениями и строковымиto_replace(GH 34789)Исправлено распространение фиксированных метаданных в
Series.abs()и ufuncs, вызываемые на Series и DataFrames (GH 28283)Ошибка в
DataFrame.replace()иSeries.replace()неправильное приведение изPeriodDtypeв тип данных object (GH 34871)Исправлена ошибка в распространении метаданных, некорректно копирующая столбцы DataFrame как метаданные, когда имя столбца совпадает с именем метаданных (GH 37037)
Исправлено распространение метаданных в
Series.dt,Series.strаксессоры,DataFrame.duplicated,DataFrame.stack,DataFrame.unstack,DataFrame.pivot,DataFrame.append,DataFrame.diff,DataFrame.applymapиDataFrame.updateметоды (GH 28283, GH 37381)Исправлено распространение метаданных при выборе столбцов с
DataFrame.__getitem__(GH 28283)Ошибка в
Index.intersection()с не-Indexне удалось установить правильное имя для возвращаемогоIndex(GH 38111)Ошибка в
RangeIndex.intersection()не удалось установить правильное имя для возвращаемогоIndexв некоторых крайних случаях (GH 38197)Ошибка в
Index.difference()не удалось установить правильное имя для возвращаемогоIndexв некоторых крайних случаях (GH 38268)Ошибка в
Index.union()работает по-разному в зависимости от того, является ли операндIndexили другой списокоподобный (GH 36384)Ошибка в
Index.intersection()с приведением несовпадающих числовых типов данных кobjectdtype вместо минимального общего dtype (GH 38122)Ошибка в
IntervalIndex.union()возвращает неправильный типIndexкогда пусто (GH 38282)Передача массива с 2 или более измерениями в
Seriesконструктор теперь вызывает более конкретноеValueErrorвместо простогоException(GH 35744)Ошибка в
dirгдеdir(obj)не показывал атрибуты, определенные на экземпляре для объектов pandas (GH 37173)Ошибка в
Index.drop()вызовInvalidIndexErrorкогда индекс имеет дубликаты (GH 38051)Ошибка в
RangeIndex.difference()возвращаяInt64Indexв некоторых случаях, когда он должен возвращатьRangeIndex(GH 38028)Исправлена ошибка в
assert_series_equal()при сравнении массива типа datetime с эквивалентным массивом нерасширенного типа данных (GH 37609)Ошибка в
is_bool_dtype()вызывало бы ошибку при передаче допустимой строки, такой как"boolean"(GH 38386)Исправлена регрессия в логических операторах, вызывающая
ValueErrorкогда столбцыDataFrameявляютсяCategoricalIndexс неиспользуемыми категориями (GH 38367)
Участники#
Всего 257 человек внесли патчи в этот релиз. Люди со знаком «+» рядом с именами внесли патч впервые.
21CSM +
AbdulMAbdi +
Abhiraj Hinge +
Abhishek Mangla +
Abo7atm +
Adam Spannbauer +
Albert Villanova del Moral
Alex Kirko
Alex Lim +
Алекс Торн +
Aleš Erjavec +
Али МакМастер
Amanda Dsouza +
Амим Кнаббен +
Andrew Wieteska
Anshoo Rajput +
Anthony Milbourne
Arun12121 +
Asish Mahapatra
Avinash Pancham +
BeanNan +
Ben Forbes +
Brendan Wilby +
Bruno Almeida +
Byron Boulton +
Чанки Патак
Крис Барнс +
Chris Lynch +
Крис Уитерс
Christoph Deil +
Christopher Hadley +
Chuanzhu Xu
Coelhudo +
Dan Moore
Daniel Saxton
David Kwong +
David Li +
Давид Мрва +
Deepak Pandey +
Deepyaman Datta
Devin Petersohn
Dmitriy Perepelkin +
Douglas Hanley +
Dāgs Grīnbergs +
Eli Treuherz +
Elliot Rampono +
Эрфан Нариман
Eric Goddard
Эрик Леунг +
Eric Wieser
Ethan Chen +
Eve +
Eyal Trabelsi +
Fabian Gebhart +
Fangchen Li
Феликс Классен +
Finlay Maguire +
Флориан Роше +
Gabriel Monteiro
Гаутам +
Gerard Jorgensen +
Грегори Лившиц
Hans
Harsh Sharma
Хонфунг Вонг +
Igor Gotlibovych +
Iqrar Agalosi Nureyza
Ирв Ластиг
Isaac Virshup
Джейкоб Пикок
Jacob Stevens-Haas +
Jan Müller +
Janus
Jeet Parekh
Jeff Hernandez +
Jeff Reback
Jiaxiang
Joao Pedro Berno Zanutto +
Joel Nothman
Joel Whittier +
John Karasinski +
Джон МакГиган +
Johnny Pribyl +
Jonas Laursen +
Jonathan Shreckengost +
Joris Van den Bossche
Хосе +
JoseNavy +
Josh Temple +
Jun Kudo +
Justin Essert
Justin Sexton +
Kaiqi Dong
Kamil Trocewicz +
Картик Матур
Кашиф +
Kenny Huynh
Кевин Шеппард
Kumar Shivam +
Леонардус Чен +
Levi Matus +
Lucas Rodés-Guirao +
Luis Pinto +
Lynch +
Марк Гарсия
Марко Горелли
Мария-Александра Илие +
Marian Denes
Марк Грэм +
Мартин Дюран
Мэтт Рёшке
Мэтью Рёшке
Маттиас Бюссонье
Maxim Ivanov +
Mayank Chaudhary +
MeeseeksMachine
Meghana Varanasi +
Metehan Kutlu +
Micael Jarniac +
Майка Смит +
Майкл Марино
Miroslav Šedivý
Мохаммад Джафар Машхади
Mohammed Kashif +
Nagesh Kumar C +
Nidhi Zare +
Нихил Чоудхари +
Number42
Oleh Kozynets +
OlivierLuG
Команда разработчиков Pandas
Paolo Lammens +
Paul Ganssle
Pax +
Peter Liu +
Филип Серлес +
Pranjal Bhardwaj +
Prayag Savsani +
Purushothaman Srikanth +
Qbiwan +
Rahul Chauhan +
Rahul Sathanapalli +
Rajat Bishnoi +
Ray Bell
Reshama Shaikh +
Richard Shadrach
Роберт Брэдшоу
Robert de Vries
Rohith295
S Mono +
С. ТАКЕНО +
Sahid Velji +
Sam Cohen +
Sam Ezebunandu +
Сандер +
Sarthak +
Сартак Вайнит Кумар +
Satrio H Wicaksono +
Scott Lasley
Shao Yang Hong +
Sharon Woo +
Shubham Mehra +
Simon Hawkins
Sixuan (Cherie) Wu +
Souris Ash +
Steffen Rehberg
Suvayu Ali
Sven
SylvainLan +
T. JEGHAM +
Терджи Петерсен
Thomas Dickson +
Thomas Heavey +
Томас Смит
Tobias Pitters
Tom Augspurger
Tomasz Sakrejda +
Torsten Wörtwein +
Ty Mick +
UrielMaD +
Uwe L. Korn
Викрамадитья Гаонкар +
VirosaLi +
W.R +
Warren White +
Wesley Boelrijk +
William Ayd
Яньсянь Линь +
Яссир Каррум +
Yong Kai Yi +
Yuanhao Geng +
Yury Mikhaylov +
Yutaro Ikeda
Yuya Takashina +
Zach Brookler +
Зак Колер +
ZhihuiChen0903 +
abmyii
alexhtn +
asharma13524 +
attack68
beanan +
chinhwee
cleconte987
danchev +
ebardie +
edwardkong
elliot rampono +
estasney +
gabicca
geetha-rangaswamaiah +
gfyoung
guru kiran
hardikpnsp +
icanhazcodeplz +
ivanovmg +
jbrockmendel
jeschwar
Разбор строк даты и времени с одинаковым смещением UTC сохранит смещение UTC в
joooeey +
junk +
krajatcl +
lacrosse91 +
leo +
lpkirwin +
lrjball
lucasrodes +
ma3da +
mavismonica +
mlondschien +
mzeitlin11 +
nguevara +
nrebena
parkdj1 +
partev
patrick
перечитать
rxxg +
samilAyoub +
sanderland
shawnbrown
sm1899 +
smartvinnetou
ssortman +
steveya +
taytzehao +
tiagohonorato +
timhunderwood
tkmz-n +
tnwei +
tpanza +
vineethraj510 +
vmdhhh +
xinrong-databricks +
yonas kassa +
yonashub +
Ádám Lippai +