Что нового в версии 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 теперь поддерживает divmod операция (GH 37165)

  • DataFrame.to_parquet() теперь возвращает bytes объект, когда нет path передается аргумент (GH 37105)

  • Rolling теперь поддерживает closed аргумент для фиксированных окон (GH 34315)

  • DatetimeIndex и Series с datetime64 или datetime64tz dtypes теперь поддерживают 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.774848 Index.sort_values(). При использовании Series.value_counts()количество пропущенных значений больше не обязательно является последним в списке подсчётов дубликатов. Вместо этого его позиция соответствует позиции в исходном Series. При использовании Index.sort_values() для Datetime-подобных Index подклассы, NaT игнорировали na_position аргумента и сортировались в начало. Теперь они учитывают na_position, по умолчанию last, так же, как другие Index подклассы (GH 35992)

  • Передача недопустимого fill_value to Categorical.take(), DatetimeArray.take(), TimedeltaArray.take(), или PeriodArray.take() теперь вызывает TypeError вместо ValueError (GH 37733)

  • Передача недопустимого fill_value to Series.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() изменится с True to False в будущем релизе. Кроме того, регулярные выражения из одного символа будут не обрабатываются как строковые литералы, когда 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() с единицей времени, отличной от наносекунд, для float dtype столбцы (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() для float dtype (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-aware DatetimeIndex (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() с timedelta64 dtype для пустого индекса или серии возвращает 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() с PeriodDtype dtype и 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)

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

Числовой#

  • Ошибка в 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() с timedelta64 dtype и skipna=False (GH 37392)

  • Ошибка в DataFrame.min() и DataFrame.max() с datetime64 dtype и skipna=False (GH 36907)

  • Ошибка в DataFrame.idxmax() и DataFrame.idxmin() со смешанными типами данных, некорректно вызывая TypeError (GH 38195)

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

  • Ошибка в DataFrame.to_dict() с orient='records' теперь возвращает нативные объекты datetime Python для столбцов типа datetime (GH 21256)

  • Ошибка в Series.astype() преобразование из string to float Когда True, выводит и разбирает даты с днём первым, например 20/01/2005 [по умолчанию: False] [в настоящее время: False] pd.NA значения (GH 37626)

Строки#

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 в object Series одинаковой длины (GH 37748, GH 37486)

  • Ошибка в Series.loc() и Series.iloc() установка всех значений object Series с элементами списка 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=False to NaN вместо 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.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() не мог обработать arraylike q при группировке по столбцам (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() с приведением несовпадающих числовых типов данных к object dtype вместо минимального общего 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 +