Что нового в версии 2.0.0 (3 апреля 2023)#

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

Улучшения#

Установка дополнительных зависимостей с помощью pip extras#

При установке pandas с помощью pip, наборы опциональных зависимостей также могут быть установлены путём указания extras.

pip install "pandas[performance, aws]>=2.0.0"

Доступные дополнительные возможности, найденные в руководство по установке, являются [all, performance, computation, fss, aws, gcp, excel, parquet, feather, hdf5, spss, postgresql, mysql, sql-other, html, xml, plot, output_formatting, clipboard, compression, test] (GH 39164).

Index теперь может содержать числовые типы данных numpy#

Теперь можно использовать любой числовой dtype numpy в Index (GH 42717).

Ранее можно было использовать только int64, uint64 & float64 dtypes:

In [1]: pd.Index([1, 2, 3], dtype=np.int8)
Out[1]: Int64Index([1, 2, 3], dtype="int64")
In [2]: pd.Index([1, 2, 3], dtype=np.uint16)
Out[2]: UInt64Index([1, 2, 3], dtype="uint64")
In [3]: pd.Index([1, 2, 3], dtype=np.float32)
Out[3]: Float64Index([1.0, 2.0, 3.0], dtype="float64")

Int64Index, UInt64Index & Float64Index были устаревшими в pandas версии 1.4 и теперь удалены. Вместо этого Index должен использоваться напрямую, и может ли он теперь принимать все числовые типы данных numpy, т.е. int8/ int16/int32/int64/uint8/uint16/uint32/uint64/float32/float64 dtypes:

In [1]: pd.Index([1, 2, 3], dtype=np.int8)
Out[1]: Index([1, 2, 3], dtype='int8')

In [2]: pd.Index([1, 2, 3], dtype=np.uint16)
Out[2]: Index([1, 2, 3], dtype='uint16')

In [3]: pd.Index([1, 2, 3], dtype=np.float32)
Out[3]: Index([1.0, 2.0, 3.0], dtype='float32')

Возможность для Index для хранения numpy числовых типов данных привело к некоторым изменениям в функциональности Pandas. В частности, операции, которые ранее были вынуждены создавать 64-битные индексы, теперь могут создавать индексы с меньшей разрядностью, например, 32-битные индексы.

Ниже приведен возможно неисчерпывающий список изменений:

  1. Создание экземпляра с использованием числового массива numpy теперь следует типу данных массива numpy. Ранее все индексы, созданные из числовых массивов numpy, принудительно преобразовывались в 64-битные. Теперь, например, Index(np.array([1, 2, 3])) будет int32 в 32-битных системах, где ранее это было бы int64 даже на 32-битных системах. Создание экземпляра Index использование списка чисел все равно вернет 64-битные типы данных, например. Index([1, 2, 3]) будет иметь int64 dtype, который совпадает с предыдущим.

  2. Различные числовые атрибуты datetime у DatetimeIndex (day, month, year и т.д.) ранее были типа dtype int64, в то время как они были int32 для arrays.DatetimeArray. Теперь они int32 на DatetimeIndex также:

    In [4]: idx = pd.date_range(start='1/1/2018', periods=3, freq='ME')
    
    In [5]: idx.array.year
    Out[5]: array([2018, 2018, 2018], dtype=int32)
    
    In [6]: idx.year
    Out[6]: Index([2018, 2018, 2018], dtype='int32')
    
  3. Типы данных уровней в индексах из Series.sparse.from_coo() теперь имеют тип данных int32, такой же, как на rows/cols на разреженной матрице scipy. Ранее они имели dtype int64.

    In [7]: from scipy import sparse
    
    In [8]: A = sparse.coo_matrix(
       ...:     ([3.0, 1.0, 2.0], ([1, 0, 0], [0, 2, 3])), shape=(3, 4)
       ...: )
       ...: 
    
    In [9]: ser = pd.Series.sparse.from_coo(A)
    
    In [10]: ser.index.dtypes
    Out[10]: 
    level_0    int32
    level_1    int32
    dtype: object
    
  4. Index не может быть создан с использованием типа данных float16. Ранее создание Index используя dtype float16 привело к Float64Index с float64 dtype. Теперь возникает NotImplementedError:

    In [11]: pd.Index([1, 2, 3], dtype=np.float16)
    ---------------------------------------------------------------------------
    NotImplementedError                       Traceback (most recent call last)
    Cell In[11], line 1
    ----> 1 pd.Index([1, 2, 3], dtype=np.float16)
    
    File ~/work/pandas/pandas/pandas/core/indexes/base.py:577, in Index.__new__(cls, data, dtype, copy, name, tupleize_cols)
        573 arr = ensure_wrapped_if_datetimelike(arr)
        575 klass = cls._dtype_to_subclass(arr.dtype)
    --> 577 arr = klass._ensure_array(arr, arr.dtype, copy=False)
        578 result = klass._simple_new(arr, name, refs=refs)
        579 if dtype is None and is_pandas_object and data_dtype == np.object_:
    
    File ~/work/pandas/pandas/pandas/core/indexes/base.py:602, in Index._ensure_array(cls, data, dtype, copy)
        599     raise ValueError("Index data must be 1-dimensional")
        600 elif dtype == np.float16:
        601     # float16 not supported (no indexing engine)
    --> 602     raise NotImplementedError("float16 indexes are not supported")
        604 if copy:
        605     # asarray_tuplesafe does not always copy underlying data,
        606     #  so need to make sure that this happens
        607     data = data.copy()
    
    NotImplementedError: float16 indexes are not supported
    

Аргумент dtype_backend, чтобы возвращать nullable типы данных на основе pyarrow или numpy#

Следующие функции получили новый ключевой параметр dtype_backend (GH 36712)

Когда эта опция установлена в "numpy_nullable" он вернет DataFrame который поддерживается обнуляемыми типами данных.

Когда этот ключевой аргумент установлен в "pyarrow", то эти функции вернут nullable-типы на основе pyarrow ArrowDtype DataFrames (GH 48957, GH 49997):

In [12]: import io

In [13]: data = io.StringIO("""a,b,c,d,e,f,g,h,i
   ....:     1,2.5,True,a,,,,,
   ....:     3,4.5,False,b,6,7.5,True,a,
   ....: """)
   ....: 

In [14]: df = pd.read_csv(data, dtype_backend="pyarrow")

In [15]: df.dtypes
Out[15]: 
a     int64[pyarrow]
b    double[pyarrow]
c      bool[pyarrow]
d    string[pyarrow]
e     int64[pyarrow]
f    double[pyarrow]
g      bool[pyarrow]
h    string[pyarrow]
i      null[pyarrow]
dtype: object

In [16]: data.seek(0)
Out[16]: 0

In [17]: df_pyarrow = pd.read_csv(data, dtype_backend="pyarrow", engine="pyarrow")

In [18]: df_pyarrow.dtypes
Out[18]: 
a     int64[pyarrow]
b    double[pyarrow]
c      bool[pyarrow]
d    string[pyarrow]
e     int64[pyarrow]
f    double[pyarrow]
g      bool[pyarrow]
h    string[pyarrow]
i      null[pyarrow]
dtype: object

Улучшения Copy-on-Write#

  • Новый механизм ленивого копирования, который откладывает копирование до изменения объекта, был добавлен к методам, перечисленным в Оптимизации Copy-on-Write. Эти методы возвращают представления при включённой копировании при записи, что обеспечивает значительное улучшение производительности по сравнению с обычным выполнением (GH 49473).

  • Доступ к одному столбцу DataFrame как к Series (например, df["col"]) теперь всегда возвращает новый объект каждый раз при его создании, когда включен Copy-on-Write (не возвращая несколько раз идентичный, кэшированный объект Series). Это гарантирует, что эти объекты Series правильно следуют правилам Copy-on-Write (GH 49450)

  • The Series конструктор теперь будет создавать ленивую копию (откладывая копирование до изменения данных) при создании Series из существующего Series с параметром по умолчанию copy=False (GH 50471)

  • The DataFrame конструктор теперь создаст ленивую копию (откладывая копирование до модификации данных) при создании из существующего DataFrame со значением по умолчанию copy=False (GH 51239)

  • The DataFrame конструктор, при создании DataFrame из словаря объектов Series и указании copy=False, теперь будет использовать ленивую копию этих объектов Series для столбцов DataFrame (GH 50777)

  • The DataFrame конструктор, при построении DataFrame из Series или Index и указание copy=False, теперь будет учитывать Copy-on-Write.

  • The DataFrame и Series конструкторы при создании из массива NumPy теперь по умолчанию копируют массив, чтобы избежать изменения DataFrame / Series при изменении массива. Укажите copy=False чтобы получить старое поведение. При установке copy=False pandas не гарантирует корректное поведение Copy-on-Write, когда массив NumPy изменяется после создания DataFrame / Series.

  • The DataFrame.from_records() теперь будет учитывать Copy-on-Write при вызове с DataFrame.

  • Попытка установить значения с помощью цепочки присваиваний (например, df["a"][1:3] = 0) теперь всегда будет выдавать предупреждение при включенном Copy-on-Write. В этом режиме цепное присваивание никогда не может работать, потому что мы всегда устанавливаем значение во временный объект, который является результатом операции индексирования (getitem), который при Copy-on-Write всегда ведет себя как копия. Таким образом, присваивание через цепочку никогда не может обновить исходный Series или DataFrame. Поэтому выдается информативное предупреждение пользователю, чтобы избежать безмолвного бездействия (GH 49467)

  • DataFrame.replace() теперь будет учитывать механизм Copy-on-Write при inplace=True.

  • DataFrame.transpose() теперь будет учитывать механизм Copy-on-Write.

  • Арифметические операции, которые могут быть выполнены на месте, например. ser *= 2 теперь будут учитывать механизм Copy-on-Write.

  • DataFrame.__getitem__() теперь будет учитывать механизм Copy-on-Write, когда DataFrame имеет MultiIndex столбцы.

  • Series.__getitem__() теперь будет учитывать механизм Copy-on-Write, когда

    Series имеет MultiIndex.

  • Series.view() теперь будет учитывать механизм Copy-on-Write.

Copy-on-Write может быть включен через один из

pd.set_option("mode.copy_on_write", True)
pd.options.mode.copy_on_write = True

Кроме того, копирование при записи можно включить локально через:

with pd.option_context("mode.copy_on_write", True):
    ...

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

  • Добавлена поддержка для str методы доступа при использовании ArrowDtype с pyarrow.string тип (GH 50325)

  • Добавлена поддержка для dt методы доступа при использовании ArrowDtype с pyarrow.timestamp тип (GH 50954)

  • read_sas() теперь поддерживает использование encoding='infer' для корректного чтения и использования кодировки, указанной в файле sas. (GH 48048)

  • DataFrameGroupBy.quantile(), SeriesGroupBy.quantile() и DataFrameGroupBy.std() теперь сохраняют nullable типы данных вместо приведения к numpy типам данных (GH 37493)

  • DataFrameGroupBy.std(), SeriesGroupBy.std() теперь поддерживают datetime64, timedelta64 и DatetimeTZDtype типы данных (GH 48481)

  • Series.add_suffix(), DataFrame.add_suffix(), Series.add_prefix() и DataFrame.add_prefix() поддерживает axis аргумент. Если axis установлен, поведение по умолчанию относительно того, какую ось рассматривать, может быть переопределено (GH 47819)

  • testing.assert_frame_equal() теперь показывает первый элемент, где DataFrames различаются, аналогично pytestвывод (GH 47910)

  • Добавлен index параметр для DataFrame.to_dict() (GH 46398)

  • Добавлена поддержка расширенных типов данных массивов в merge() (GH 44240)

  • Добавлено распространение метаданных для бинарных операторов на DataFrame (GH 28283)

  • Добавлен cumsum, cumprod, cummin и cummax в ExtensionArray интерфейс через _accumulate (GH 28385)

  • CategoricalConversionWarning, InvalidComparison, InvalidVersion, LossySetitemError, и NoBufferPresent теперь доступны в pandas.errors (GH 27656)

  • Исправление test optional_extra путем добавления отсутствующего тестового пакета pytest-asyncio (GH 48361)

  • DataFrame.astype() сообщение об исключении улучшено для включения имени столбца, когда преобразование типа невозможно. (GH 47571)

  • date_range() теперь поддерживает unit ключевое слово (“s”, “ms”, “us” или “ns”) для указания желаемого разрешения выходного индекса (GH 49106)

  • timedelta_range() теперь поддерживает unit ключевое слово (“s”, “ms”, “us” или “ns”) для указания желаемого разрешения выходного индекса (GH 49824)

  • DataFrame.to_json() теперь поддерживает mode ключевое слово с поддерживаемыми вводами 'w' и 'a'. По умолчанию 'w', 'a' можно использовать, когда lines=True и orient='records', чтобы добавить ориентированные на записи строки JSON в существующий файл JSON. (GH 35849)

  • Добавлен name параметр для IntervalIndex.from_breaks(), IntervalIndex.from_arrays() и IntervalIndex.from_tuples() (GH 48911)

  • Улучшено сообщение об исключении при использовании testing.assert_frame_equal() на DataFrame включить столбец, который сравнивается (GH 50323)

  • Улучшено сообщение об ошибке для merge_asof() когда столбцы соединения были дублированы (GH 50102)

  • Добавлена поддержка типов данных extension array для get_dummies() (GH 32430)

  • Добавлен Index.infer_objects() аналогично Series.infer_objects() (GH 50034)

  • Добавлен copy параметр для Series.infer_objects() и DataFrame.infer_objects(), передавая False будет избегать создания копий для серий или столбцов, которые уже не являются объектами или где не может быть выведен лучший dtype (GH 50096)

  • DataFrame.plot.hist() теперь распознаёт xlabel и ylabel аргументы (GH 49793)

  • Series.drop_duplicates() получил ignore_index ключевое слово для сброса индекса (GH 48304)

  • Series.dropna() и DataFrame.dropna() получил ignore_index ключевое слово для сброса индекса (GH 31725)

  • Улучшенное сообщение об ошибке в to_datetime() для не-ISO8601 форматов, информируя пользователей о позиции первой ошибки (GH 50361)

  • Улучшено сообщение об ошибке при попытке выровнять DataFrame объекты (например, в DataFrame.compare()) для уточнения, что "идентично помеченные" относится как к индексу, так и к столбцам (GH 50083)

  • Добавлена поддержка для Index.min() и Index.max() для pyarrow строковых типов данных (GH 51397)

  • Добавлен DatetimeIndex.as_unit() и TimedeltaIndex.as_unit() для преобразования в разные разрешения; поддерживаемые разрешения: «s», «ms», «us» и «ns» (GH 50616)

  • Добавлен Series.dt.unit() и Series.dt.as_unit() для преобразования в разные разрешения; поддерживаемые разрешения: «s», «ms», «us» и «ns» (GH 51223)

  • Добавлен новый аргумент dtype to read_sql() для согласованности с read_sql_query() (GH 50797)

  • read_csv(), read_table(), read_fwf() и read_excel() теперь принимают date_format (GH 50601)

  • to_datetime() теперь принимает "ISO8601" в качестве аргумента для format, который будет соответствовать любой строке ISO8601 (но возможно не идентично отформатированной) (GH 50411)

  • to_datetime() теперь принимает "mixed" в качестве аргумента для format, который будет определять формат для каждого элемента отдельно (GH 50972)

  • Добавлен новый аргумент engine to read_json() для поддержки парсинга JSON с помощью pyarrow путем указания engine="pyarrow" (GH 48893)

  • Добавлена поддержка SQLAlchemy 2.0 (GH 40686)

  • Добавлена поддержка для decimal параметр, когда engine="pyarrow" в read_csv() (GH 51302)

  • Index операции над множествами Index.union(), Index.intersection(), Index.difference(), и Index.symmetric_difference() теперь поддерживает sort=True, который всегда возвращает отсортированный результат, в отличие от стандартного sort=None который не сортирует в некоторых случаях (GH 25151)

  • Добавлен новый режим экранирования "latex-math" для избежания экранирования "$" в форматтере (GH 50040)

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

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

DataFrameGroupBy.cumsum() и DataFrameGroupBy.cumprod() переполнение вместо потери точности при приведении к float#

В предыдущих версиях мы приводили к типу float при применении cumsum и cumprod что приводило к некорректным результатам, даже если результат мог быть сохранен int64 тип данных. Кроме того, агрегация переполняется согласованно с numpy и обычным DataFrame.cumprod() и DataFrame.cumsum() методы, когда предел int64 достигнуто (GH 37493).

Старое поведение

In [1]: df = pd.DataFrame({"key": ["b"] * 7, "value": 625})
In [2]: df.groupby("key")["value"].cumprod()[5]
Out[2]: 5.960464477539062e+16

Мы возвращаем некорректные результаты с 6-м значением.

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

In [19]: df = pd.DataFrame({"key": ["b"] * 7, "value": 625})

In [20]: df.groupby("key")["value"].cumprod()
Out[20]: 
0                   625
1                390625
2             244140625
3          152587890625
4        95367431640625
5     59604644775390625
6    359414837200037393
Name: value, dtype: int64

Мы переполняемся на 7-м значении, но 6-е значение всё ещё корректно.

DataFrameGroupBy.nth() и SeriesGroupBy.nth() теперь ведут себя как фильтрации#

В предыдущих версиях pandas, DataFrameGroupBy.nth() и SeriesGroupBy.nth() действовали так, как если бы они были агрегациями. Однако для большинства входных данных n, они могут возвращать либо ноль, либо несколько строк на группу. Это означает, что они являются фильтрациями, аналогичными, например, DataFrameGroupBy.head(). pandas теперь рассматривает их как фильтрации (GH 13666).

In [21]: df = pd.DataFrame({"a": [1, 1, 2, 1, 2], "b": [np.nan, 2.0, 3.0, 4.0, 5.0]})

In [22]: gb = df.groupby("a")

Старое поведение

In [5]: gb.nth(n=1)
Out[5]:
   A    B
1  1  2.0
4  2  5.0

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

In [23]: gb.nth(n=1)
Out[23]: 
   a    b
1  1  2.0
4  2  5.0

В частности, индекс результата формируется из входных данных путем выбора соответствующих строк. Также, когда n больше, чем группа, нет строк вместо NaN возвращается.

Старое поведение

In [5]: gb.nth(n=3, dropna="any")
Out[5]:
    B
A
1 NaN
2 NaN

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

In [24]: gb.nth(n=3, dropna="any")
Out[24]: 
Empty DataFrame
Columns: [a, b]
Index: []

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

Создание с типом datetime64 или timedelta64 с неподдерживаемым разрешением#

В предыдущих версиях при создании Series или DataFrame и передача dtype "datetime64" или "timedelta64" с неподдерживаемым разрешением (т.е. любым, кроме "ns"), pandas молча заменял заданный dtype на его наносекундный аналог:

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

In [5]: pd.Series(["2016-01-01"], dtype="datetime64[s]")
Out[5]:
0   2016-01-01
dtype: datetime64[ns]

In [6] pd.Series(["2016-01-01"], dtype="datetime64[D]")
Out[6]:
0   2016-01-01
dtype: datetime64[ns]

В pandas 2.0 мы поддерживаем разрешения "s", "ms", "us" и "ns". При передаче поддерживаемого dtype (например, "datetime64[s]"), результат теперь имеет точно запрошенный dtype:

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

In [25]: pd.Series(["2016-01-01"], dtype="datetime64[s]")
Out[25]: 
0   2016-01-01
dtype: datetime64[s]

С неподдерживаемым типом данных pandas теперь вызывает исключение вместо тихой замены на поддерживаемый тип данных:

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

In [26]: pd.Series(["2016-01-01"], dtype="datetime64[D]")
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[26], line 1
----> 1 pd.Series(["2016-01-01"], dtype="datetime64[D]")

File ~/work/pandas/pandas/pandas/core/series.py:587, in Series.__init__(self, data, index, dtype, name, copy, fastpath)
    585         data = data.copy()
    586 else:
--> 587     data = sanitize_array(data, index, dtype, copy)
    589     manager = _get_option("mode.data_manager", silent=True)
    590     if manager == "block":

File ~/work/pandas/pandas/pandas/core/construction.py:648, in sanitize_array(data, index, dtype, copy, allow_2d)
    645     subarr = np.array([], dtype=np.float64)
    647 elif dtype is not None:
--> 648     subarr = _try_cast(data, dtype, copy)
    650 else:
    651     subarr = maybe_convert_platform(data)

File ~/work/pandas/pandas/pandas/core/construction.py:808, in _try_cast(arr, dtype, copy)
    803     return lib.ensure_string_array(arr, convert_na_value=False, copy=copy).reshape(
    804         shape
    805     )
    807 elif dtype.kind in "mM":
--> 808     return maybe_cast_to_datetime(arr, dtype)
    810 # GH#15832: Check if we are requesting a numeric dtype and
    811 # that we can convert the data to the requested dtype.
    812 elif dtype.kind in "iu":
    813     # this will raise if we have e.g. floats

File ~/work/pandas/pandas/pandas/core/dtypes/cast.py:1230, in maybe_cast_to_datetime(value, dtype)
   1226     raise TypeError("value must be listlike")
   1228 # TODO: _from_sequence would raise ValueError in cases where
   1229 #  _ensure_nanosecond_dtype raises TypeError
-> 1230 _ensure_nanosecond_dtype(dtype)
   1232 if lib.is_np_dtype(dtype, "m"):
   1233     res = TimedeltaArray._from_sequence(value, dtype=dtype)

File ~/work/pandas/pandas/pandas/core/dtypes/cast.py:1287, in _ensure_nanosecond_dtype(dtype)
   1284     raise ValueError(msg)
   1285 # TODO: ValueError or TypeError? existing test
   1286 #  test_constructor_generic_timestamp_bad_frequency expects TypeError
-> 1287 raise TypeError(
   1288     f"dtype={dtype} is not supported. Supported resolutions are 's', "
   1289     "'ms', 'us', and 'ns'"
   1290 )

TypeError: dtype=datetime64[D] is not supported. Supported resolutions are 's', 'ms', 'us', and 'ns'

Улучшена скорость count#

В прошлых версиях, при запуске Series.value_counts(), результат унаследовал бы имя исходного объекта, а индекс результата был бы безымянным. Это вызвало бы путаницу при сбросе индекса, и имена столбцов не соответствовали бы значениям столбцов. Теперь имя результата будет 'count' (или 'proportion' if normalize=True был передан), и индекс будет назван в соответствии с исходным объектом (GH 49497).

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

In [8]: pd.Series(['quetzal', 'quetzal', 'elk'], name='animal').value_counts()

Out[2]:
quetzal    2
elk        1
Name: animal, dtype: int64

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

In [27]: pd.Series(['quetzal', 'quetzal', 'elk'], name='animal').value_counts()
Out[27]: 
animal
quetzal    2
elk        1
Name: count, dtype: int64

Аналогично для других value_counts методы (например, DataFrame.value_counts()).

Запретить преобразование astype в неподдерживаемые типы данных datetime64/timedelta64#

В предыдущих версиях преобразование Series или DataFrame из datetime64[ns] в другой datetime64[X] dtype вернёт с datetime64[ns] dtype вместо запрошенного dtype. В pandas 2.0 добавлена поддержка dtypes "datetime64[s]", "datetime64[ms]" и "datetime64[us]", поэтому преобразование в эти dtypes дает точно запрошенный dtype:

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

In [28]: idx = pd.date_range("2016-01-01", periods=3)

In [29]: ser = pd.Series(idx)

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

In [4]: ser.astype("datetime64[s]")
Out[4]:
0   2016-01-01
1   2016-01-02
2   2016-01-03
dtype: datetime64[ns]

С новым поведением мы получаем точно запрошенный dtype:

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

In [30]: ser.astype("datetime64[s]")
Out[30]: 
0   2016-01-01
1   2016-01-02
2   2016-01-03
dtype: datetime64[s]

Для неподдерживаемых разрешений, например "datetime64[D]", мы вызываем исключение вместо тихого игнорирования запрошенного dtype:

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

In [31]: ser.astype("datetime64[D]")
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[31], line 1
----> 1 ser.astype("datetime64[D]")

File ~/work/pandas/pandas/pandas/core/generic.py:6665, in NDFrame.astype(self, dtype, copy, errors)
   6659     results = [
   6660         ser.astype(dtype, copy=copy, errors=errors) for _, ser in self.items()
   6661     ]
   6663 else:
   6664     # else, only a single dtype is given
-> 6665     new_data = self._mgr.astype(dtype=dtype, copy=copy, errors=errors)
   6666     res = self._constructor_from_mgr(new_data, axes=new_data.axes)
   6667     return res.__finalize__(self, method="astype")

File ~/work/pandas/pandas/pandas/core/internals/managers.py:449, in BaseBlockManager.astype(self, dtype, copy, errors)
    446 elif using_copy_on_write():
    447     copy = False
--> 449 return self.apply(
    450     "astype",
    451     dtype=dtype,
    452     copy=copy,
    453     errors=errors,
    454     using_cow=using_copy_on_write(),
    455 )

File ~/work/pandas/pandas/pandas/core/internals/managers.py:363, in BaseBlockManager.apply(self, f, align_keys, **kwargs)
    361         applied = b.apply(f, **kwargs)
    362     else:
--> 363         applied = getattr(b, f)(**kwargs)
    364     result_blocks = extend_blocks(applied, result_blocks)
    366 out = type(self).from_blocks(result_blocks, self.axes)

File ~/work/pandas/pandas/pandas/core/internals/blocks.py:784, in Block.astype(self, dtype, copy, errors, using_cow, squeeze)
    781         raise ValueError("Can not squeeze with more than one column.")
    782     values = values[0, :]  # type: ignore[call-overload]
--> 784 new_values = astype_array_safe(values, dtype, copy=copy, errors=errors)
    786 new_values = maybe_coerce_values(new_values)
    788 refs = None

File ~/work/pandas/pandas/pandas/core/dtypes/astype.py:237, in astype_array_safe(values, dtype, copy, errors)
    234     dtype = dtype.numpy_dtype
    236 try:
--> 237     new_values = astype_array(values, dtype, copy=copy)
    238 except (ValueError, TypeError):
    239     # e.g. _astype_nansafe can fail on object-dtype of strings
    240     #  trying to convert to float
    241     if errors == "ignore":

File ~/work/pandas/pandas/pandas/core/dtypes/astype.py:179, in astype_array(values, dtype, copy)
    175     return values
    177 if not isinstance(values, np.ndarray):
    178     # i.e. ExtensionArray
--> 179     values = values.astype(dtype, copy=copy)
    181 else:
    182     values = _astype_nansafe(values, dtype, copy=copy)

File ~/work/pandas/pandas/pandas/core/arrays/datetimes.py:741, in DatetimeArray.astype(self, dtype, copy)
    739 elif isinstance(dtype, PeriodDtype):
    740     return self.to_period(freq=dtype.freq)
--> 741 return dtl.DatetimeLikeArrayMixin.astype(self, dtype, copy)

File ~/work/pandas/pandas/pandas/core/arrays/datetimelike.py:517, in DatetimeLikeArrayMixin.astype(self, dtype, copy)
    513 elif (dtype.kind in "mM" and self.dtype != dtype) or dtype.kind == "f":
    514     # disallow conversion between datetime/timedelta,
    515     # and conversions for any datetimelike to float
    516     msg = f"Cannot cast {type(self).__name__} to dtype {dtype}"
--> 517     raise TypeError(msg)
    518 else:
    519     return np.asarray(self, dtype=dtype)

TypeError: Cannot cast DatetimeArray to dtype datetime64[D]

Для преобразования из timedelta64[ns] типы данных, старое поведение преобразовывало в формат с плавающей точкой.

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

In [32]: idx = pd.timedelta_range("1 Day", periods=3)

In [33]: ser = pd.Series(idx)

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

In [7]: ser.astype("timedelta64[s]")
Out[7]:
0     86400.0
1    172800.0
2    259200.0
dtype: float64

In [8]: ser.astype("timedelta64[D]")
Out[8]:
0    1.0
1    2.0
2    3.0
dtype: float64

Новое поведение, как и для datetime64, либо дает точно запрошенный тип данных, либо вызывает исключение:

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

In [34]: ser.astype("timedelta64[s]")
Out[34]: 
0   1 days
1   2 days
2   3 days
dtype: timedelta64[s]

In [35]: ser.astype("timedelta64[D]")
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Cell In[35], line 1
----> 1 ser.astype("timedelta64[D]")

File ~/work/pandas/pandas/pandas/core/generic.py:6665, in NDFrame.astype(self, dtype, copy, errors)
   6659     results = [
   6660         ser.astype(dtype, copy=copy, errors=errors) for _, ser in self.items()
   6661     ]
   6663 else:
   6664     # else, only a single dtype is given
-> 6665     new_data = self._mgr.astype(dtype=dtype, copy=copy, errors=errors)
   6666     res = self._constructor_from_mgr(new_data, axes=new_data.axes)
   6667     return res.__finalize__(self, method="astype")

File ~/work/pandas/pandas/pandas/core/internals/managers.py:449, in BaseBlockManager.astype(self, dtype, copy, errors)
    446 elif using_copy_on_write():
    447     copy = False
--> 449 return self.apply(
    450     "astype",
    451     dtype=dtype,
    452     copy=copy,
    453     errors=errors,
    454     using_cow=using_copy_on_write(),
    455 )

File ~/work/pandas/pandas/pandas/core/internals/managers.py:363, in BaseBlockManager.apply(self, f, align_keys, **kwargs)
    361         applied = b.apply(f, **kwargs)
    362     else:
--> 363         applied = getattr(b, f)(**kwargs)
    364     result_blocks = extend_blocks(applied, result_blocks)
    366 out = type(self).from_blocks(result_blocks, self.axes)

File ~/work/pandas/pandas/pandas/core/internals/blocks.py:784, in Block.astype(self, dtype, copy, errors, using_cow, squeeze)
    781         raise ValueError("Can not squeeze with more than one column.")
    782     values = values[0, :]  # type: ignore[call-overload]
--> 784 new_values = astype_array_safe(values, dtype, copy=copy, errors=errors)
    786 new_values = maybe_coerce_values(new_values)
    788 refs = None

File ~/work/pandas/pandas/pandas/core/dtypes/astype.py:237, in astype_array_safe(values, dtype, copy, errors)
    234     dtype = dtype.numpy_dtype
    236 try:
--> 237     new_values = astype_array(values, dtype, copy=copy)
    238 except (ValueError, TypeError):
    239     # e.g. _astype_nansafe can fail on object-dtype of strings
    240     #  trying to convert to float
    241     if errors == "ignore":

File ~/work/pandas/pandas/pandas/core/dtypes/astype.py:179, in astype_array(values, dtype, copy)
    175     return values
    177 if not isinstance(values, np.ndarray):
    178     # i.e. ExtensionArray
--> 179     values = values.astype(dtype, copy=copy)
    181 else:
    182     values = _astype_nansafe(values, dtype, copy=copy)

File ~/work/pandas/pandas/pandas/core/arrays/timedeltas.py:358, in TimedeltaArray.astype(self, dtype, copy)
    354         return type(self)._simple_new(
    355             res_values, dtype=res_values.dtype, freq=self.freq
    356         )
    357     else:
--> 358         raise ValueError(
    359             f"Cannot convert from {self.dtype} to {dtype}. "
    360             "Supported resolutions are 's', 'ms', 'us', 'ns'"
    361         )
    363 return dtl.DatetimeLikeArrayMixin.astype(self, dtype, copy=copy)

ValueError: Cannot convert from timedelta64[ns] to timedelta64[D]. Supported resolutions are 's', 'ms', 'us', 'ns'

UTC и временные зоны с фиксированным смещением по умолчанию используют объекты tzinfo из стандартной библиотеки#

В предыдущих версиях значение по умолчанию tzinfo объект, используемый для представления UTC был pytz.UTC. В pandas 2.0 по умолчанию используется datetime.timezone.utc вместо. Аналогично, для часовых поясов, представляющих фиксированные смещения UTC, мы используем datetime.timezone объекты вместо pytz.FixedOffset объектов. См. (GH 34916)

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

In [2]: ts = pd.Timestamp("2016-01-01", tz="UTC")
In [3]: type(ts.tzinfo)
Out[3]: pytz.UTC

In [4]: ts2 = pd.Timestamp("2016-01-01 04:05:06-07:00")
In [3]: type(ts2.tzinfo)
Out[5]: pytz._FixedOffset

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

In [36]: ts = pd.Timestamp("2016-01-01", tz="UTC")

In [37]: type(ts.tzinfo)
Out[37]: datetime.timezone

In [38]: ts2 = pd.Timestamp("2016-01-01 04:05:06-07:00")

In [39]: type(ts2.tzinfo)
Out[39]: datetime.timezone

Для часовых поясов, которые не являются ни UTC, ни фиксированными смещениями, например, "US/Pacific", мы по-прежнему по умолчанию используем pytz объекты.

Пустые DataFrame/Series теперь по умолчанию будут иметь RangeIndex#

Ранее, создание пустого (где data является None или пустой аргумент, подобный списку) Series или DataFrame без указания осей (index=None, columns=None) вернет оси пустыми Index с типом данных object.

Теперь оси возвращают пустой RangeIndex (GH 49572).

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

In [8]: pd.Series().index
Out[8]:
Index([], dtype='object')

In [9] pd.DataFrame().axes
Out[9]:
[Index([], dtype='object'), Index([], dtype='object')]

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

In [40]: pd.Series().index
Out[40]: RangeIndex(start=0, stop=0, step=1)

In [41]: pd.DataFrame().axes
Out[41]: [RangeIndex(start=0, stop=0, step=1), RangeIndex(start=0, stop=0, step=1)]

DataFrame в LaTeX имеет новый механизм рендеринга#

Существующий DataFrame.to_latex() была переструктурирована для использования расширенной реализации, ранее доступной под Styler.to_latex(). Сигнатура аргументов схожа, хотя col_space был удален, так как игнорируется движками LaTeX. Этот движок рендеринга также требует jinja2 как зависимость, которую необходимо установить, поскольку рендеринг основан на шаблонах jinja2.

Следующие опции pandas для LaTeX больше не используются и были удалены. Общие аргументы max rows и columns остаются, но для этой функциональности должны быть заменены эквивалентами Styler. Альтернативные опции, дающие аналогичную функциональность, указаны ниже:

  • display.latex.escape: заменено на styler.format.escape,

  • display.latex.longtable: заменено на styler.latex.environment,

  • display.latex.multicolumn, display.latex.multicolumn_format и display.latex.multirow: заменено на styler.sparse.rows, styler.sparse.columns, styler.latex.multirow_align и styler.latex.multicol_align,

  • display.latex.repr: заменено на styler.render.repr,

  • display.max_rows и display.max_columns: заменить на styler.render.max_rows, styler.render.max_columns и styler.render.max_elements.

Обратите внимание, что из-за этого изменения некоторые значения по умолчанию также изменились:

  • multirow теперь по умолчанию True.

  • multirow_align по умолчанию “r” вместо “l”.

  • multicol_align по умолчанию “r” вместо “l”.

  • escape теперь по умолчанию False.

Обратите внимание, что поведение _repr_latex_ также изменено. Ранее установка display.latex.repr генерировал LaTeX только при использовании nbconvert для JupyterNotebook, а не когда пользователь запускает блокнот. Теперь styler.render.repr параметр позволяет контролировать конкретный вывод в JupyterNotebooks для операций (не только для nbconvert). См. GH 39911.

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

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

Пакет

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

Обязательно

Изменено

mypy (dev)

1.0

X

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

7.0.0

X

pytest-xdist (dev)

2.2.0

X

гипотеза (разработка)

6.34.2

X

python-dateutil

2.8.2

X

X

tzdata

2022.1

X

X

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

Пакет

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

Изменено

pyarrow

7.0.0

X

matplotlib

3.6.1

X

fastparquet

0.6.3

X

xarray

0.21.0

X

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

Дата и время теперь парсятся с согласованным форматом#

В прошлом, to_datetime() угадывал формат для каждого элемента независимо. Это было уместно в некоторых случаях, когда элементы имели смешанные форматы дат - однако это регулярно вызывало проблемы, когда пользователи ожидали единообразного формата, но функция переключала форматы между элементами. Начиная с версии 2.0.0, разбор будет использовать единообразный формат, определяемый первым не-NA значением (если пользователь не указал формат, в этом случае используется указанный).

Старое поведение:

In [1]: ser = pd.Series(['13-01-2000', '12-01-2000'])
In [2]: pd.to_datetime(ser)
Out[2]:
0   2000-01-13
1   2000-12-01
dtype: datetime64[ns]

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

In [42]: ser = pd.Series(['13-01-2000', '12-01-2000'])

In [43]: pd.to_datetime(ser)
Out[43]: 
0   2000-01-13
1   2000-01-12
dtype: datetime64[ns]

Обратите внимание, что это влияет на read_csv() также.

Если вам всё ещё нужно анализировать даты с несовместимыми форматами, вы можете использовать format='mixed' (возможно, вместе с dayfirst)

ser = pd.Series(['13-01-2000', '12 January 2000'])
pd.to_datetime(ser, format='mixed', dayfirst=True)

или, если все ваши форматы соответствуют ISO8601 (но возможно не одинаково отформатированы)

ser = pd.Series(['2020-01-01', '2020-01-01 03:00'])
pd.to_datetime(ser, format='ISO8601')

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

  • The freq, tz, nanosecond, и unit ключевые слова в Timestamp конструктор теперь принимает только ключевые слова (GH 45307, GH 32526)

  • Передача nanoseconds больше 999 или меньше 0 в Timestamp теперь вызывает ValueError (GH 48538, GH 48255)

  • read_csv(): указание неверного количества столбцов с index_col теперь вызывает ParserError вместо IndexError при использовании парсера c.

  • Значение по умолчанию для dtype в get_dummies() изменено на bool из uint8 (GH 45848)

  • DataFrame.astype(), Series.astype(), и DatetimeIndex.astype() приведение данных datetime64 к любому из “datetime64[s]”, “datetime64[ms]”, “datetime64[us]” вернет объект с заданным разрешением вместо приведения обратно к “datetime64[ns]” (GH 48928)

  • DataFrame.astype(), Series.astype(), и DatetimeIndex.astype() приведение данных timedelta64 к любому из "timedelta64[s]", "timedelta64[ms]", "timedelta64[us]" вернёт объект с заданным разрешением вместо приведения к типу "float64" (GH 48963)

  • DatetimeIndex.astype(), TimedeltaIndex.astype(), PeriodIndex.astype() Series.astype(), DataFrame.astype() с datetime64, timedelta64 или PeriodDtype типы данных больше не позволяют преобразовывать в целочисленные типы данных, кроме 'int64', делают obj.astype('int64', copy=False).astype(dtype) вместо (GH 49715)

  • Index.astype() теперь позволяет преобразование из float64 dtype к datetime-подобным dtypes, соответствуя Series поведение (GH 49660)

  • Передача данных с dtype "timedelta64[s]", "timedelta64[ms]" или "timedelta64[us]" в TimedeltaIndex, Series, или DataFrame конструкторы теперь будут сохранять этот dtype вместо приведения к «timedelta64[ns]»; данные timedelta64 с более низким разрешением будут приведены к наименьшему поддерживаемому разрешению «timedelta64[s]» (GH 49014)

  • Передача dtype из "timedelta64[s]", "timedelta64[ms]", или "timedelta64[us]" в TimedeltaIndex, Series, или DataFrame конструкторы теперь будут сохранять этот тип данных вместо приведения к “timedelta64[ns]”; передача типа данных с более низким разрешением для Series или DataFrame будет приведено к наименьшему поддерживаемому разрешению "timedelta64[s]" (GH 49014)

  • Передача np.datetime64 объект с разрешением не в наносекундах в Timestamp сохранит исходное разрешение, если оно "s", "ms", "us" или "ns"; в противном случае будет приведено к ближайшему поддерживаемому разрешению (GH 49008)

  • Передача datetime64 значения с разрешением, отличным от наносекунд, в to_datetime() сохранит исходное разрешение, если оно "s", "ms", "us" или "ns"; в противном случае будет приведено к ближайшему поддерживаемому разрешению (GH 50369)

  • Передача целочисленных значений и типа данных datetime64 не в наносекундах (например, “datetime64[s]”) DataFrame, Series, или Index будет рассматривать значения как кратные единице типа данных, соответствуя поведению, например, Series(np.array(values, dtype="M8[s]")) (GH 51092)

  • Передача строки в формате ISO-8601 в Timestamp сохранит разрешение разобранного ввода, если оно “s”, “ms”, “us” или “ns”; в противном случае оно будет приведено к ближайшему поддерживаемому разрешению (GH 49737)

  • The other аргумент в DataFrame.mask() и Series.mask() теперь по умолчанию no_default вместо np.nan согласовано с DataFrame.where() и Series.where(). Записи будут заполнены соответствующим значением NULL (np.nan для типов данных numpy, pd.NA для типов данных расширений). (GH 49111)

  • Изменено поведение Series.quantile() и DataFrame.quantile() с SparseDtype для сохранения разреженного типа данных (GH 49583)

  • При создании Series с объектным типом данных Index объектов datetime, pandas больше не преобразует индекс в DatetimeIndex (GH 39307, GH 23598)

  • pandas.testing.assert_index_equal() с параметром exact="equiv" теперь считает два индекса равными, когда оба являются либо RangeIndex или Index с int64 dtype. Ранее это означало либо RangeIndex или Int64Index (GH 51098)

  • Series.unique() с типом данных "timedelta64[ns]" или "datetime64[ns]" теперь возвращает TimedeltaArray или DatetimeArray вместо numpy.ndarray (GH 49176)

  • to_datetime() и DatetimeIndex теперь разрешают последовательности, содержащие как datetime объекты и числовые записи, сопоставление Series поведение (GH 49037, GH 50453)

  • pandas.api.types.is_string_dtype() теперь возвращает только True для массивоподобных объектов с dtype=object когда элементы выводятся как строки (GH 15585)

  • Передача последовательности, содержащей datetime объекты и date объекты в Series конструктор вернёт с object dtype вместо datetime64[ns] dtype, согласованный с Index поведение (GH 49341)

  • Передача строк, которые не могут быть преобразованы в дату/время в Series или DataFrame с dtype="datetime64[ns]" будет вызывать исключение вместо молчаливого игнорирования ключевого слова и возврата object тип данных (GH 24435)

  • Передача последовательности, содержащей тип, который не может быть преобразован в Timedelta to to_timedelta() или к Series или DataFrame конструктор с dtype="timedelta64[ns]" или для TimedeltaIndex теперь вызывает TypeError вместо ValueError (GH 49525)

  • Изменено поведение Index конструктор с последовательностью, содержащей хотя бы один NaT подобное списку или None, по умолчанию None None или NaN для определения datetime64[ns] dtype вместо object, соответствуя Series поведение (GH 49340)

  • read_stata() с параметром index_col установлено в None (по умолчанию) теперь будет устанавливать индекс на возвращаемом DataFrame в RangeIndex вместо Int64Index (GH 49745)

  • Изменено поведение Index, Series, и DataFrame арифметические методы при работе с объектными типами данных, результаты больше не выполняют вывод типа для результата операций с массивами, используйте result.infer_objects(copy=False) для вывода типа результата (GH 49999, GH 49714)

  • Изменено поведение Index конструктор с типом данных object numpy.ndarray содержащий все-bool значения или все комплексные значения, теперь это будет сохранять тип object, в соответствии с Series поведение (GH 49594)

  • Изменено поведение Series.astype() из содержащего тип object bytes объекты в строковые типы данных; теперь это делает val.decode() на объектах bytes вместо str(val), соответствуя Index.astype() поведение (GH 45326)

  • Добавлен "None" по умолчанию na_values в read_csv() (GH 50286)

  • Изменено поведение Series и DataFrame конструкторов при передаче целочисленного типа данных и данных с плавающей точкой, которые не являются круглыми числами, теперь вызывает ValueError вместо молчаливого сохранения типа float; сделать Series(data) или DataFrame(data) чтобы получить старое поведение, и Series(data).astype(dtype) или DataFrame(data).astype(dtype) для получения указанного типа данных (GH 49599)

  • Изменено поведение DataFrame.shift() с axis=1, целое число fill_value, и однородный datetime-подобный dtype, теперь заполняет новые столбцы целочисленными dtypes вместо приведения к datetimelike (GH 49842)

  • Файлы теперь закрываются при возникновении исключения в read_json() (GH 49921)

  • Изменено поведение read_csv(), read_json() & read_fwf(), где индекс теперь всегда будет RangeIndex, когда индекс не указан. Ранее индекс был бы Index с типом данных object если новый DataFrame/Series имеет длину 0 (GH 49572)

  • DataFrame.values(), DataFrame.to_numpy(), DataFrame.xs(), DataFrame.reindex(), DataFrame.fillna(), и DataFrame.replace() больше не объединяет базовые массивы без уведомления; выполнять df = df.copy() для обеспечения консолидации (GH 49356)

  • Создание нового DataFrame с использованием полного среза по обеим осям с loc или iloc (таким образом, df.loc[:, :] или df.iloc[:, :]) теперь возвращает новый DataFrame (поверхностную копию) вместо исходного DataFrame, что согласуется с другими методами получения полного среза (например df.loc[:] или df[:]) (GH 49469)

  • The Series и DataFrame конструкторы теперь будут возвращать поверхностную копию (т.е. делиться данными, но не атрибутами) при передаче Series и DataFrame, соответственно, и с настройкой по умолчанию copy=False (и если никакой другой ключевой аргумент не вызывает копирование). Ранее новая Series или DataFrame делила бы атрибут индекса (например, df.index = ... также обновит индекс родительского или дочернего элемента) (GH 49523)

  • Запретить вычисление cumprod для Timedelta object; ранее это возвращало некорректные значения (GH 50246)

  • DataFrame объекты, прочитанные из HDFStore файл без индекса теперь имеет RangeIndex вместо int64 индекс (был выбран как)

  • Создание экземпляра Index с числовым numpy dtype с данными, содержащими NA и/или NaT теперь вызывает ValueError. Ранее TypeError был поднят (GH 51050)

  • Загрузка JSON-файла с дублирующимися столбцами с помощью read_json(orient='split') переименовывает столбцы, чтобы избежать дубликатов, как read_csv() и другие ридеры делают (GH 50370)

  • Уровни индекса Series возвращен из Series.sparse.from_coo теперь всегда имеют тип данных int32. Ранее они имели тип данных int64 (GH 50926)

  • to_datetime() с unit любого из значений "Y" или "M" теперь вызовет ошибку, если последовательность содержит неокруглённое float значение, соответствующее Timestamp поведение (GH 50301)

  • Методы Series.round(), DataFrame.__invert__(), Series.__invert__(), DataFrame.swapaxes(), DataFrame.first(), DataFrame.last(), Series.first(), Series.last() и DataFrame.align() теперь всегда будет возвращать новые объекты (GH 51032)

  • DataFrame и DataFrameGroupBy агрегации (например, «sum») со столбцами типа object больше не выводят не-object типы для своих результатов, явно вызовите result.infer_objects(copy=False) на результат, чтобы получить старое поведение (GH 51205, GH 49603)

  • Деление на ноль с ArrowDtype dtypes возвращает -inf, nan, или inf в зависимости от числителя, вместо вызова исключения (GH 51541)

  • Добавлен pandas.api.types.is_any_real_numeric_dtype() для проверки реальных числовых типов данных (GH 51152)

  • value_counts() теперь возвращает данные с ArrowDtype с pyarrow.int64 тип вместо "Int64" тип (GH 51462)

  • factorize() и unique() сохранить исходный dtype при передаче numpy timedelta64 или datetime64 с разрешением не в наносекундах (GH 48670)

Примечание

Текущий PDEP предлагает устаревание и удаление ключевых слов inplace и copy для всех, кроме небольшого подмножества методов из API pandas. Текущее обсуждение происходит на здесь. Ключевые слова больше не будут необходимы в контексте Copy-on-Write. Если это предложение будет принято, оба ключевых слова будут устаревшими в следующем выпуске pandas и удалены в pandas 3.0.

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

  • Устаревший парсинг строк даты и времени с системным локальным часовым поясом для tzlocal, передайте tz ключевое слово или явно вызвать tz_localize вместо (GH 50791)

  • Устаревший аргумент infer_datetime_format в to_datetime() и read_csv(), так как его строгая версия теперь используется по умолчанию (GH 48621)

  • Устаревшее поведение to_datetime() с unit при разборе строк, в будущей версии они будут разбираться как даты и время (соответствуя поведению без единиц измерения) вместо приведения к числам с плавающей точкой. Чтобы сохранить старое поведение, приведите строки к числовым типам перед вызовом to_datetime() (GH 50735)

  • Устаревший pandas.io.sql.execute() (GH 50185)

  • Index.is_boolean() был объявлен устаревшим. Используйте pandas.api.types.is_bool_dtype() вместо (GH 50042)

  • Index.is_integer() был объявлен устаревшим. Используйте pandas.api.types.is_integer_dtype() вместо (GH 50042)

  • Index.is_floating() был объявлен устаревшим. Используйте pandas.api.types.is_float_dtype() вместо (GH 50042)

  • Index.holds_integer() был объявлен устаревшим. Используйте pandas.api.types.infer_dtype() вместо (GH 50243)

  • Index.is_numeric() был объявлен устаревшим. Используйте pandas.api.types.is_any_real_numeric_dtype() вместо (GH 50042,:issue:51152)

  • Index.is_categorical() был объявлен устаревшим. Используйте pandas.api.types.is_categorical_dtype() вместо (GH 50042)

  • Index.is_object() был объявлен устаревшим. Используйте pandas.api.types.is_object_dtype() вместо (GH 50042)

  • Index.is_interval() был объявлен устаревшим. Используйте pandas.api.types.is_interval_dtype() вместо (GH 50042)

  • Устаревший аргумент date_parser в read_csv(), read_table(), read_fwf(), и read_excel() в пользу date_format (GH 50601)

  • Устаревший all и any редукции с datetime64 и DatetimeTZDtype типов данных, используйте, например, (obj != pd.Timestamp(0), tz=obj.tz).all() вместо (GH 34479)

  • Устаревшие неиспользуемые аргументы *args и **kwargs в Resampler (GH 50977)

  • Устаревший вызов float или int на одном элементе Series для возврата float или int соответственно. Извлеките элемент перед вызовом float или int вместо (GH 51101)

  • Устаревший Grouper.groups(), используйте Groupby.groups() вместо (GH 51182)

  • Устаревший Grouper.grouper(), используйте Groupby.grouper() вместо (GH 51182)

  • Устаревший Grouper.obj(), используйте Groupby.obj() вместо (GH 51206)

  • Устаревший Grouper.indexer(), используйте Resampler.indexer() вместо (GH 51206)

  • Устаревший Grouper.ax(), используйте Resampler.ax() вместо (GH 51206)

  • Устаревшее ключевое слово use_nullable_dtypes в read_parquet(), используйте dtype_backend вместо (GH 51853)

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

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

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

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

  • Устаревший close(). Используйте StataReader как контекстный менеджер вместо (GH 49228)

  • Устаревшее создание скаляра при итерации по DataFrameGroupBy или SeriesGroupBy который был сгруппирован по level параметр, который является списком длины 1; вместо этого будет возвращен кортеж длины один (GH 51583)

Удаление устаревших функций/изменений предыдущих версий#

  • Удалено Int64Index, UInt64Index и Float64Index. См. также здесь для получения дополнительной информации (GH 42717)

  • Удалены устаревшие Timestamp.freq, Timestamp.freqstr и аргумент freq из Timestamp конструкторе и Timestamp.fromordinal() (GH 14146)

  • Удалены устаревшие CategoricalBlock, Block.is_categorical(), требуют, чтобы значения datetime64 и timedelta64 были обёрнуты в DatetimeArray или TimedeltaArray перед передачей в Block.make_block_same_class(), требуют DatetimeTZBlock.values иметь правильный ndim при передаче в BlockManager конструктор и удалил ключевое слово “fastpath” из SingleBlockManager конструктор (GH 40226, GH 40571)

  • Удалена устаревшая глобальная опция use_inf_as_null в пользу use_inf_as_na (GH 17126)

  • Удален устаревший модуль pandas.core.index (GH 30193)

  • Удален устаревший псевдоним pandas.core.tools.datetimes.to_time, импортировать функцию напрямую из pandas.core.tools.times вместо (GH 34145)

  • Удален устаревший псевдоним pandas.io.json.json_normalize, импортировать функцию напрямую из pandas.json_normalize вместо (GH 27615)

  • Удалены устаревшие Categorical.to_dense(), используйте np.asarray(cat) вместо (GH 32639)

  • Удалены устаревшие Categorical.take_nd() (GH 27745)

  • Удалены устаревшие Categorical.mode(), используйте Series(cat).mode() вместо (GH 45033)

  • Удалены устаревшие Categorical.is_dtype_equal() и CategoricalIndex.is_dtype_equal() (GH 37545)

  • Удалены устаревшие CategoricalIndex.take_nd() (GH 30702)

  • Удалены устаревшие Index.is_type_compatible() (GH 42113)

  • Удалены устаревшие Index.is_mixed(), проверьте index.inferred_type напрямую вместо этого (GH 32922)

  • Удалены устаревшие pandas.api.types.is_categorical(); используйте pandas.api.types.is_categorical_dtype() вместо этого (GH 33385)

  • Удалены устаревшие Index.asi8() (GH 37877)

  • Принудительное устаревание, изменяющее поведение при передаче datetime64[ns] dtype данных и dtype с учётом часового пояса в Series, интерпретируя значения как локальное время вместо времени UTC, соответствуя DatetimeIndex поведение (GH 41662)

  • Принудительное устаревание изменения поведения при применении numpy ufunc к нескольким невыровненным (по индексу или столбцам) DataFrame который теперь сначала выровняет входные данные (GH 39239)

  • Удалены устаревшие DataFrame._AXIS_NUMBERS(), DataFrame._AXIS_NAMES(), Series._AXIS_NUMBERS(), Series._AXIS_NAMES() (GH 33637)

  • Удалены устаревшие Index.to_native_types(), используйте obj.astype(str) вместо (GH 36418)

  • Удалены устаревшие Series.iteritems(), DataFrame.iteritems(), используйте obj.items вместо (GH 45321)

  • Удалены устаревшие DataFrame.lookup() (GH 35224)

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

  • Удалены устаревшие Series.iteritems(), DataFrame.iteritems() и HDFStore.iteritems() использовать obj.items вместо (GH 45321)

  • Удалены устаревшие DatetimeIndex.union_many() (GH 45018)

  • Удалены устаревшие weekofyear и week атрибуты DatetimeArray, DatetimeIndex и dt аксессор в пользу isocalendar().week (GH 33595)

  • Удалены устаревшие RangeIndex._start(), RangeIndex._stop(), RangeIndex._step(), используйте start, stop, step вместо (GH 30482)

  • Удалены устаревшие DatetimeIndex.to_perioddelta(), Используйте dtindex - dtindex.to_period(freq).to_timestamp() вместо (GH 34853)

  • Удалены устаревшие Styler.hide_index() и Styler.hide_columns() (GH 49397)

  • Удалены устаревшие Styler.set_na_rep() и Styler.set_precision() (GH 49397)

  • Удалены устаревшие Styler.where() (GH 49397)

  • Удалены устаревшие Styler.render() (GH 49397)

  • Удален устаревший аргумент col_space в DataFrame.to_latex() (GH 47970)

  • Удален устаревший аргумент null_color в Styler.highlight_null() (GH 49397)

  • Удален устаревший аргумент check_less_precise в testing.assert_frame_equal(), testing.assert_extension_array_equal(), testing.assert_series_equal(), testing.assert_index_equal() (GH 30562)

  • Удалены устаревшие null_counts аргумент в DataFrame.info(). Используйте show_counts вместо (GH 37999)

  • Удалены устаревшие Index.is_monotonic(), и Series.is_monotonic(); используйте obj.is_monotonic_increasing вместо (GH 45422)

  • Удалены устаревшие Index.is_all_dates() (GH 36697)

  • Принудительное устаревание, запрещающее передачу данных с учетом часового пояса Timestamp и dtype="datetime64[ns]" to Series или DataFrame конструкторы (GH 41555)

  • Принудительное устаревание, запрещающее передачу последовательности значений с информацией о часовом поясе и dtype="datetime64[ns]" в Series или DataFrame конструкторы (GH 41555)

  • Принудительное устаревание, запрещающее numpy.ma.mrecords.MaskedRecords в DataFrame конструктор; передайте "{name: data[name] for name in data.dtype.names} вместо (GH 40363)

  • Принудительное устаревание, запрещающее тип данных “datetime64” без единиц измерения в Series.astype() и DataFrame.astype() (GH 47844)

  • Принудительное устаревание, запрещающее использование .astype преобразовать datetime64[ns] Series, DataFrame, или DatetimeIndex в тип данных с учетом часового пояса, используйте obj.tz_localize или ser.dt.tz_localize вместо (GH 39258)

  • Принудительное устаревание, запрещающее использование .astype для преобразования часового пояса с учётом Series, DataFrame, или DatetimeIndex в не зависящее от часового пояса datetime64[ns] тип данных, используйте obj.tz_localize(None) или obj.tz_convert("UTC").tz_localize(None) вместо (GH 39258)

  • Принудительное устаревание, запрещающее передачу небулевого аргумента в sort в concat() (GH 44629)

  • Удалены функции парсера дат parse_date_time(), parse_date_fields(), parse_all_fields() и generic_parser() (GH 24518)

  • Удаленный аргумент index из core.arrays.SparseArray конструктор (GH 43523)

  • Удалить аргумент squeeze из DataFrame.groupby() и Series.groupby() (GH 32380)

  • Удалены устаревшие apply, apply_index, __call__, onOffset, и isAnchored атрибуты из DateOffset (GH 34171)

  • Удалено keep_tz аргумент в DatetimeIndex.to_series() (GH 29731)

  • Удалить аргументы names и dtype из Index.copy() и levels и codes из MultiIndex.copy() (GH 35853, GH 36685)

  • Удалить аргумент inplace из MultiIndex.set_levels() и MultiIndex.set_codes() (GH 35626)

  • Удалённые аргументы verbose и encoding из DataFrame.to_excel() и Series.to_excel() (GH 47912)

  • Удаленный аргумент line_terminator из DataFrame.to_csv() и Series.to_csv(), используйте lineterminator вместо (GH 45302)

  • Удаленный аргумент inplace из DataFrame.set_axis() и Series.set_axis(), используйте obj = obj.set_axis(..., copy=False) вместо (GH 48130)

  • Запретить передачу позиционных аргументов в MultiIndex.set_levels() и MultiIndex.set_codes() (GH 41485)

  • Запретить парсинг строк Timedelta с компонентами с единицами "Y", "y" или "M", так как они не представляют однозначные длительности (GH 36838)

  • Удалено MultiIndex.is_lexsorted() и MultiIndex.lexsort_depth() (GH 38701)

  • Удаленный аргумент how из PeriodIndex.astype(), используйте PeriodIndex.to_timestamp() вместо (GH 37982)

  • Удаленный аргумент try_cast из DataFrame.mask(), DataFrame.where(), Series.mask() и Series.where() (GH 38836)

  • Удаленный аргумент tz из Period.to_timestamp(), используйте obj.to_timestamp(...).tz_localize(tz) вместо (GH 34522)

  • Удаленный аргумент sort_columns в DataFrame.plot() и Series.plot() (GH 47563)

  • Удаленный аргумент is_copy из DataFrame.take() и Series.take() (GH 30615)

  • Удаленный аргумент kind из Index.get_slice_bound(), Index.slice_indexer() и Index.slice_locs() (GH 41378)

  • Удалённые аргументы prefix, squeeze, error_bad_lines и warn_bad_lines из read_csv() (GH 40413, GH 43427)

  • Удалённые аргументы squeeze из read_excel() (GH 43427)

  • Удаленный аргумент datetime_is_numeric из DataFrame.describe() и Series.describe() как данные даты и времени всегда будут суммироваться как числовые данные (GH 34798)

  • Запретить передачу списка key to Series.xs() и DataFrame.xs(), передайте кортеж вместо (GH 41789)

  • Запрет специфичных для подкласса ключевых слов (например, “freq”, “tz”, “names”, “closed”) в Index конструктор (GH 38597)

  • Удаленный аргумент inplace из Categorical.remove_unused_categories() (GH 37918)

  • Запрет передачи нецелых чисел с плавающей точкой в Timestamp с unit="M" или unit="Y" (GH 47266)

  • Удалить ключевые слова convert_float и mangle_dupe_cols из read_excel() (GH 41176)

  • Удалить ключевое слово mangle_dupe_cols из read_csv() и read_table() (GH 48137)

  • Удалено errors ключевое слово из DataFrame.where(), Series.where(), DataFrame.mask() и Series.mask() (GH 47728)

  • Запретить передачу неключевых аргументов в read_excel() кроме io и sheet_name (GH 34418)

  • Запретить передачу неключевых аргументов в DataFrame.drop() и Series.drop() кроме labels (GH 41486)

  • Запретить передачу неключевых аргументов в DataFrame.fillna() и Series.fillna() кроме value (GH 41485)

  • Запретить передачу неключевых аргументов в StringMethods.split() и StringMethods.rsplit() за исключением pat (GH 47448)

  • Запретить передачу неключевых аргументов в DataFrame.set_index() кроме keys (GH 41495)

  • Запретить передачу неключевых аргументов в Resampler.interpolate() кроме method (GH 41699)

  • Запретить передачу неключевых аргументов в DataFrame.reset_index() и Series.reset_index() кроме level (GH 41496)

  • Запретить передачу неключевых аргументов в DataFrame.dropna() и Series.dropna() (GH 41504)

  • Запретить передачу неключевых аргументов в ExtensionArray.argsort() (GH 46134)

  • Запретить передачу неключевых аргументов в Categorical.sort_values() (GH 47618)

  • Запретить передачу неключевых аргументов в Index.drop_duplicates() и Series.drop_duplicates() (GH 41485)

  • Запретить передачу неключевых аргументов в DataFrame.drop_duplicates() за исключением subset (GH 41485)

  • Запретить передачу неключевых аргументов в DataFrame.sort_index() и Series.sort_index() (GH 41506)

  • Запретить передачу неключевых аргументов в DataFrame.interpolate() и Series.interpolate() за исключением method (GH 41510)

  • Запретить передачу неключевых аргументов в DataFrame.any() и Series.any() (GH 44896)

  • Запретить передачу неключевых аргументов в Index.set_names() за исключением names (GH 41551)

  • Запретить передачу неключевых аргументов в Index.join() за исключением other (GH 46518)

  • Запретить передачу неключевых аргументов в concat() за исключением objs (GH 41485)

  • Запретить передачу неключевых аргументов в pivot() за исключением data (GH 48301)

  • Запретить передачу неключевых аргументов в DataFrame.pivot() (GH 48301)

  • Запретить передачу неключевых аргументов в read_html() за исключением io (GH 27573)

  • Запретить передачу неключевых аргументов в read_json() за исключением path_or_buf (GH 27573)

  • Запретить передачу неключевых аргументов в read_sas() за исключением filepath_or_buffer (GH 47154)

  • Запретить передачу неключевых аргументов в read_stata() за исключением filepath_or_buffer (GH 48128)

  • Запретить передачу неключевых аргументов в read_csv() кроме filepath_or_buffer (GH 41485)

  • Запретить передачу неключевых аргументов в read_table() кроме filepath_or_buffer (GH 41485)

  • Запретить передачу неключевых аргументов в read_fwf() кроме filepath_or_buffer (GH 44710)

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

  • Запретить передачу неключевых аргументов в Series.mask() и DataFrame.mask() кроме cond и other (GH 41580)

  • Запретить передачу неключевых аргументов в DataFrame.to_stata() за исключением path (GH 48128)

  • Запретить передачу неключевых аргументов в DataFrame.where() и Series.where() за исключением cond и other (GH 41523)

  • Запретить передачу неключевых аргументов в Series.set_axis() и DataFrame.set_axis() за исключением labels (GH 41491)

  • Запретить передачу неключевых аргументов в Series.rename_axis() и DataFrame.rename_axis() за исключением mapper (GH 47587)

  • Запретить передачу неключевых аргументов в Series.clip() и DataFrame.clip() кроме lower и upper (GH 41511)

  • Запретить передачу неключевых аргументов в Series.bfill(), Series.ffill(), DataFrame.bfill() и DataFrame.ffill() (GH 41508)

  • Запретить передачу неключевых аргументов в DataFrame.replace(), Series.replace() за исключением to_replace и value (GH 47587)

  • Запретить передачу неключевых аргументов в DataFrame.sort_values() за исключением by (GH 41505)

  • Запретить передачу неключевых аргументов в Series.sort_values() (GH 41505)

  • Запретить передачу неключевых аргументов в DataFrame.reindex() за исключением labels (GH 17966)

  • Запретить Index.reindex() с неуникальными Index объекты (GH 42568)

  • Запрещено создание Categorical со скаляром data (GH 38433)

  • Запрещено создание CategoricalIndex без передачи data (GH 38944)

  • Удалено Rolling.validate(), Expanding.validate(), и ExponentialMovingWindow.validate() (GH 43665)

  • Удалено Rolling.win_type возвращая "freq" (GH 38963)

  • Удалено Rolling.is_datetimelike (GH 38963)

  • Удалён level ключевое слово в DataFrame и Series агрегации; используйте groupby вместо (GH 39983)

  • Удалены устаревшие Timedelta.delta(), Timedelta.is_populated(), и Timedelta.freq (GH 46430, GH 46476)

  • Удалены устаревшие NaT.freq (GH 45071)

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

  • Удалён numeric_only ключевое слово из Categorical.min() и Categorical.max() в пользу skipna (GH 48821)

  • Изменено поведение DataFrame.median() и DataFrame.mean() с numeric_only=None чтобы не исключать столбцы, подобные дате и времени. ЭТО ПРИМЕЧАНИЕ СТАНЕТ НЕАКТУАЛЬНЫМ, КОГДА numeric_only=None ПРЕКРАЩЕНИЕ ИСПОЛЬЗОВАНИЯ ПРИМЕНЯЕТСЯ (GH 29941)

  • Удалено is_extension_type() в пользу is_extension_array_dtype() (GH 29457)

  • Удалено .ExponentialMovingWindow.vol (GH 39220)

  • Удалено Index.get_value() и Index.set_value() (GH 33907, GH 28621)

  • Удалено Series.slice_shift() и DataFrame.slice_shift() (GH 37601)

  • Удалить DataFrameGroupBy.pad() и DataFrameGroupBy.backfill() (GH 45076)

  • Удалить numpy аргумент из read_json() (GH 30636)

  • Запретить передачу сокращений для orient в DataFrame.to_dict() (GH 32516)

  • Запретить частичное срезывание на немонотонном DatetimeIndex с ключами, которых нет в Index. Теперь это вызывает KeyError (GH 18531)

  • Удалено get_offset в пользу to_offset() (GH 30340)

  • Удалён warn ключевое слово в infer_freq() (GH 45947)

  • Удалён include_start и include_end аргументы в DataFrame.between_time() в пользу inclusive (GH 43248)

  • Удалён closed аргумент в date_range() и bdate_range() в пользу inclusive аргумент (GH 40245)

  • Удалён center ключевое слово в DataFrame.expanding() (GH 20647)

  • Удалён truediv ключевое слово из eval() (GH 29812)

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

  • Удалён pandas.datetime подмодуль (GH 30489)

  • Удалён pandas.np подмодуль (GH 30296)

  • Удалено pandas.util.testing в пользу pandas.testing (GH 30745)

  • Удалено Series.str.__iter__() (GH 28277)

  • Удалено pandas.SparseArray в пользу arrays.SparseArray (GH 30642)

  • Удалено pandas.SparseSeries и pandas.SparseDataFrame, включая поддержку pickle. (GH 30642)

  • Запрещена передача целого числа fill_value to DataFrame.shift() и Series.shift`() с типами datetime64, timedelta64 или period (GH 32591)

  • Запрещено использование строковой метки столбца в times в DataFrame.ewm() (GH 43265)

  • Запрещена передача True и False в inclusive в Series.between() в пользу "both" и "neither" соответственно (GH 40628)

  • Запрещено использование usecols с индексами вне диапазона для read_csv с engine="c" (GH 25623)

  • Запрещено использование **kwargs в ExcelWriter; используйте аргумент ключевого слова engine_kwargs вместо (GH 40430)

  • Запрещена передача кортежа меток столбцов в DataFrameGroupBy.__getitem__() (GH 30546)

  • Запрещено отсутствие меток при индексации последовательностью меток на уровне MultiIndex. Теперь это вызывает KeyError (GH 42351)

  • Запрещено установка значений с .loc используя позиционный срез. Используйте .loc с метками или .iloc с позициями вместо (GH 31840)

  • Запрещено позиционное индексирование с float ключ, даже если этот ключ является круглым числом, вручную преобразуйте в целое число вместо (GH 34193)

  • Запрещено использование DataFrame индексатор с .iloc, используйте .loc вместо автоматического выравнивания (GH 39022)

  • Запрещено использование set или dict индексаторы в __getitem__ и __setitem__ методы (GH 42825)

  • Запрещено индексирование на Index или позиционное индексирование на Series создание многомерных объектов, например, obj[:, None], преобразуйте в numpy перед индексированием вместо (GH 35141)

  • Запрещено использование dict или set объекты в suffixes в merge() (GH 34810)

  • Запрещено использование merge() для создания дублирующихся столбцов через suffixes ключевое слово и уже существующие столбцы (GH 22818)

  • Запрещено использование merge() или join() на разном количестве уровней (GH 34862)

  • Запрещено использование value_name аргумент в DataFrame.melt() для сопоставления элемента в DataFrame столбцы (GH 35003)

  • Запрещена передача showindex в **kwargs в DataFrame.to_markdown() и Series.to_markdown() в пользу index (GH 33091)

  • Удалена возможность прямой установки Categorical._codes (GH 41429)

  • Удалена возможность напрямую устанавливать Categorical.categories (GH 47834)

  • Удаленный аргумент inplace из Categorical.add_categories(), Categorical.remove_categories(), Categorical.set_categories(), Categorical.rename_categories(), Categorical.reorder_categories(), Categorical.set_ordered(), Categorical.as_ordered(), Categorical.as_unordered() (GH 37981, GH 41118, GH 41133, GH 47834)

  • Принудительно Rolling.count() с min_periods=None по умолчанию использовать размер окна (GH 31302)

  • Переименовано fname to path в DataFrame.to_parquet(), DataFrame.to_stata() и DataFrame.to_feather() (GH 30338)

  • Запрещено индексирование Series со списком из одного элемента со срезом (например, ser[[slice(0, 2)]]). Либо преобразуйте список в кортеж, либо передайте срез напрямую вместо (GH 31333)

  • Изменено поведение индексации на DataFrame с DatetimeIndex индекс с использованием строкового индексатора, ранее это работало как срез по строкам, теперь работает как любой другой ключ столбца; используйте frame.loc[key] для старого поведения (GH 36179)

  • Принудительно применён display.max_colwidth опция не принимать отрицательные целые числа (GH 31569)

  • Удалён display.column_space опция в пользу df.to_string(col_space=...) (GH 47280)

  • Удален устаревший метод mad из классов pandas (GH 11787)

  • Удален устаревший метод tshift из классов pandas (GH 11631)

  • Изменено поведение при передаче пустых данных в Series; тип данных по умолчанию будет object вместо float64 (GH 29405)

  • Изменено поведение DatetimeIndex.union(), DatetimeIndex.intersection(), и DatetimeIndex.symmetric_difference() с несовпадающими часовыми поясами для преобразования в UTC вместо приведения к типу object (GH 39328)

  • Изменено поведение to_datetime() с аргументом "now" с utc=False для соответствия Timestamp("now") (GH 18705)

  • Изменено поведение индексации для объектов с учетом часового пояса DatetimeIndex с временной зоной, не учитывающей часовой пояс datetime объект или наоборот; теперь они ведут себя как любой другой несравнимый тип, вызывая KeyError (GH 36148)

  • Изменено поведение Index.reindex(), Series.reindex(), и DataFrame.reindex() с datetime64 dtype и datetime.date объект для fill_value; они больше не считаются эквивалентными datetime.datetime объекты, поэтому reindex приводит к типу данных object (GH 39767)

  • Изменено поведение SparseArray.astype() при указании типа данных, который не является явно SparseDtype, преобразовать в точно запрошенный dtype, а не молча использовать SparseDtype вместо (GH 34457)

  • Изменено поведение Index.ravel() для возврата представления на исходном Index вместо np.ndarray (GH 36900)

  • Изменено поведение Series.to_frame() и Index.to_frame() Мохаммад Ахмади + name=None использовать None для имени столбца вместо имени индекса или значения по умолчанию 0 (GH 45523)

  • Изменено поведение concat() с одним массивом bool-dtype и другой целочисленного типа, теперь возвращает object dtype вместо целочисленного dtype; явно преобразуйте объект bool в целое число перед объединением, чтобы получить старое поведение (GH 45101)

  • Изменено поведение DataFrame конструктору с плавающей точкой data и целое число dtype, когда данные не могут быть преобразованы без потерь, сохраняется тип данных с плавающей точкой, что соответствует Series поведение (GH 41170)

  • Изменено поведение Index конструктор при передаче np.ndarray с объектным типом данных, содержащим числовые записи; теперь сохраняется объектный тип данных вместо вывода числового типа данных, в соответствии с Series поведение (GH 42870)

  • Изменено поведение Index.__and__(), Index.__or__() и Index.__xor__() вести себя как логические операции (соответствие Series поведение) вместо псевдонимов для операций над множествами (GH 37374)

  • Изменено поведение DataFrame конструктор, когда передан список, первый элемент которого является Categorical, теперь это обрабатывает элементы как строки, приводя к object dtype, согласованный с поведением для других типов (GH 38845)

  • Изменено поведение DataFrame конструктору при передаче dtype (кроме int), к которому данные не могут быть приведены; теперь возникает исключение вместо тихого игнорирования типа данных (GH 41733)

  • Изменено поведение Series конструктор, он больше не будет определять тип данных datetime64 или timedelta64 из строковых записей (GH 41731)

  • Изменено поведение Timestamp конструктор с np.datetime64 объект и tz передается для интерпретации входных данных как локального времени, а не времени UTC (GH 42288)

  • Изменено поведение Timestamp.utcfromtimestamp() для возврата объекта с учетом часового пояса, удовлетворяющего Timestamp.utcfromtimestamp(val).timestamp() == val (GH 45083)

  • Изменено поведение Index конструктору при передаче SparseArray или SparseDtype чтобы сохранить этот тип данных вместо приведения к numpy.ndarray (GH 43930)

  • Изменено поведение операций, подобных setitem (__setitem__, fillna, where, mask, replace, insert, fill_value для shift) на объекте с DatetimeTZDtype при использовании значения с несовпадающим часовым поясом, значение будет приведено к часовому поясу объекта вместо приведения обоих к типу object-dtype (GH 44243)

  • Изменено поведение Index, Series, DataFrame конструкторы с данными с плавающей точкой и DatetimeTZDtype, данные теперь интерпретируются как время UTC вместо локального времени, что согласуется с обработкой данных целочисленного типа (GH 45573)

  • Изменено поведение Series и DataFrame конструкторы с целочисленным dtype и данными с плавающей точкой, содержащими NaN, теперь вызывает IntCastingNaNError (GH 40110)

  • Изменено поведение Series и DataFrame конструкторы с целым числом dtype и значения, которые слишком велики для безпотерьного приведения к этому типу данных, теперь вызывают ValueError (GH 41734)

  • Изменено поведение Series и DataFrame конструкторы с целым числом dtype и значения, имеющие либо datetime64 или timedelta64 типы данных, теперь вызывает TypeError, используйте values.view("int64") вместо (GH 41770)

  • Удален устаревший base и loffset аргументы из pandas.DataFrame.resample(), pandas.Series.resample() и pandas.Grouper. Используйте offset или origin вместо (GH 31809)

  • Изменено поведение Series.fillna() и DataFrame.fillna() с timedelta64[ns] тип данных и несовместимый fill_value; теперь это преобразуется в object dtype вместо вызова исключения, что согласуется с поведением для других типов данных (GH 45746)

  • Изменить аргумент по умолчанию для regex для Series.str.replace() из True to False. Кроме того, один символ pat с regex=True теперь обрабатывается как регулярное выражение вместо строкового литерала. (GH 36695, GH 24804)

  • Изменено поведение DataFrame.any() и DataFrame.all() с bool_only=True; столбцы object-dtype со всеми булевыми значениями больше не будут включаться, вручную приведены к bool тип данных сначала (GH 46188)

  • Изменено поведение DataFrame.max(), DataFrame.min, DataFrame.mean, DataFrame.median, DataFrame.skew, DataFrame.kurt с axis=None для возврата скаляра, применяя агрегацию по обеим осям (GH 45072)

  • Изменено поведение сравнения Timestamp с datetime.date объект; теперь они сравниваются как неравные и вызывают ошибку при сравнениях на неравенство, соответствуя datetime.datetime поведение (GH 36131)

  • Изменено поведение сравнения NaT с datetime.date объект; теперь при сравнении на неравенство вызываются исключения (GH 39196)

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

  • Изменено поведение DataFrame.apply() со списко-подобным, чтобы любая частичная ошибка вызывала исключение (GH 43740)

  • Изменено поведение DataFrame.to_latex() теперь использовать реализацию Styler через Styler.to_latex() (GH 47970)

  • Изменено поведение Series.__setitem__() с целочисленным ключом и Float64Index когда ключ отсутствует в индексе; ранее мы рассматривали ключ как позиционный (поведение, подобное series.iloc[key] = val), теперь мы рассматриваем это как метку (ведёт себя как series.loc[key] = val), согласованно с Series.__getitem__`() поведение (GH 33469)

  • Удалено na_sentinel аргумент из factorize(), Index.factorize(), и ExtensionArray.factorize() (GH 47157)

  • Изменено поведение Series.diff() и DataFrame.diff() с ExtensionDtype типы данных, массивы которых не реализуют diff, теперь вызывают TypeError вместо приведения к numpy (GH 31025)

  • Принудительное устаревание вызова numpy "ufunc" на DataFrame с method="outer"; теперь вызывает NotImplementedError (GH 36955)

  • Принудительное устаревание, запрещающее передачу numeric_only=True to Series редукции (rank, any, all, …) с нечисловым типом данных (GH 47500)

  • Изменено поведение DataFrameGroupBy.apply() и SeriesGroupBy.apply() так что group_keys соблюдается, даже если обнаружен трансформер (GH 34998)

  • Сравнения между DataFrame и Series где столбцы фрейма не соответствуют индексу серии, вызывают ValueError вместо автоматического выравнивания, выполните left, right = left.align(right, axis=1, copy=False) перед сравнением (GH 36795)

  • Принудительное устаревание numeric_only=None (по умолчанию) в редукциях DataFrame, которые молча отбрасывали столбцы, вызвавшие ошибку; numeric_only теперь по умолчанию False (GH 41480)

  • Изменено значение по умолчанию для numeric_only to False во всех методах DataFrame с этим аргументом (GH 46096, GH 46906)

  • Изменено значение по умолчанию для numeric_only to False в Series.rank() (GH 47561)

  • Принудительное устаревание тихого удаления лишних столбцов в операциях groupby и resample, когда numeric_only=False (GH 41475)

  • Принудительное устаревание тихого отбрасывания лишних столбцов в Rolling, Expanding, и ExponentialMovingWindow операции. Теперь будет вызываться errors.DataError (GH 42834)

  • Измененное поведение при установке значений с помощью df.loc[:, foo] = bar или df.iloc[:, foo] = bar, теперь они всегда пытаются установить значения на месте перед возвратом к приведению типов (GH 45333)

  • Изменено значение по умолчанию для numeric_only в различных DataFrameGroupBy методы; все методы теперь по умолчанию используют numeric_only=False (GH 46072)

  • Изменено значение по умолчанию для numeric_only to False в Resampler методы (GH 47177)

  • Использование метода DataFrameGroupBy.transform() с вызываемым объектом, возвращающим DataFrames, будет выровнен по индексу входных данных (GH 47244)

  • При предоставлении списка столбцов длиной один для DataFrame.groupby(), ключи, которые возвращаются при итерации по результирующему DataFrameGroupBy объект теперь будет кортежами длины один (GH 47761)

  • Удалены устаревшие методы ExcelWriter.write_cells(), ExcelWriter.save(), ExcelWriter.cur_sheet(), ExcelWriter.handles(), ExcelWriter.path() (GH 45795)

  • The ExcelWriter атрибут book больше не может быть установлен; он все еще доступен для доступа и изменения (GH 48943)

  • Удалены неиспользуемые *args и **kwargs в Rolling, Expanding, и ExponentialMovingWindow ops (GH 47851)

  • Удалён устаревший аргумент line_terminator из DataFrame.to_csv() (GH 45302)

  • Удалён устаревший аргумент label из lreshape() (GH 30219)

  • Аргументы после expr в DataFrame.eval() и DataFrame.query() являются только ключевыми словами (GH 47587)

  • Удалено Index._get_attributes_dict() (GH 50648)

  • Удалено Series.__array_wrap__() (GH 50648)

  • Изменено поведение DataFrame.value_counts() для возврата Series с MultiIndex для любого спискообразного (один элемент или нет), но Index для одиночной метки (GH 50829)

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

  • Улучшение производительности в DataFrameGroupBy.median() и SeriesGroupBy.median() и DataFrameGroupBy.cumprod() для nullable типов данных (GH 37493)

  • Улучшение производительности в DataFrameGroupBy.all(), DataFrameGroupBy.any(), SeriesGroupBy.all(), и SeriesGroupBy.any() для типа данных object (GH 50623)

  • Улучшение производительности в MultiIndex.argsort() и MultiIndex.sort_values() (GH 48406)

  • Улучшение производительности в MultiIndex.size() (GH 48723)

  • Улучшение производительности в MultiIndex.union() без пропущенных значений и без дубликатов (GH 48505, GH 48752)

  • Улучшение производительности в MultiIndex.difference() (GH 48606)

  • Улучшение производительности в MultiIndex операции над множествами с sort=None (GH 49010)

  • Улучшение производительности в DataFrameGroupBy.mean(), SeriesGroupBy.mean(), DataFrameGroupBy.var(), и SeriesGroupBy.var() для типов данных extension array (GH 37493)

  • Улучшение производительности в MultiIndex.isin() когда level=None (GH 48622, GH 49577)

  • Улучшение производительности в MultiIndex.putmask() (GH 49830)

  • Улучшение производительности в Index.union() и MultiIndex.union() когда индекс содержит дубликаты (GH 48900)

  • Улучшение производительности в Series.rank() для типов данных на основе pyarrow (GH 50264)

  • Улучшение производительности в Series.searchsorted() для типов данных на основе pyarrow (GH 50447)

  • Улучшение производительности в Series.fillna() для типов данных extension array (GH 49722, GH 50078)

  • Улучшение производительности в Index.join(), Index.intersection() и Index.union() для масок и типов arrow, когда Index монотонен (GH 50310, GH 51365)

  • Улучшение производительности для Series.value_counts() с обнуляемым типом данных (GH 48338)

  • Улучшение производительности для Series конструктор, передающий целочисленный массив numpy с nullable dtype (GH 48338)

  • Улучшение производительности для DatetimeIndex конструктор, передавая список (GH 48609)

  • Улучшение производительности в merge() и DataFrame.join() при объединении по отсортированному MultiIndex (GH 48504)

  • Улучшение производительности в to_datetime() при разборе строк со смещениями часовых поясов (GH 50107)

  • Улучшение производительности в DataFrame.loc() и Series.loc() для индексации на основе кортежа в MultiIndex (GH 48384)

  • Улучшение производительности для Series.replace() с категориальным типом данных (GH 49404)

  • Улучшение производительности для MultiIndex.unique() (GH 48335)

  • Улучшение производительности для операций индексирования с nullable и arrow dtypes (GH 49420, GH 51316)

  • Улучшение производительности для concat() с индексами на основе extension array (GH 49128, GH 49178)

  • Улучшение производительности для api.types.infer_dtype() (GH 51054)

  • Уменьшение использования памяти DataFrame.to_pickle()/Series.to_pickle() при использовании BZ2 или LZMA (GH 49068)

  • Улучшение производительности для StringArray конструктор, передающий массив numpy с типом np.str_ (GH 49109)

  • Улучшение производительности в from_tuples() (GH 50620)

  • Улучшение производительности в factorize() (GH 49177)

  • Улучшение производительности в __setitem__() (GH 50248, GH 50632)

  • Улучшение производительности в ArrowExtensionArray методы сравнения, когда массив содержит NA (GH 50524)

  • Улучшение производительности в to_numpy() (GH 49973, GH 51227)

  • Улучшение производительности при разборе строк в BooleanDtype (GH 50613)

  • Улучшение производительности в DataFrame.join() при соединении по подмножеству MultiIndex (GH 48611)

  • Улучшение производительности для MultiIndex.intersection() (GH 48604)

  • Улучшение производительности в DataFrame.__setitem__() (GH 46267)

  • Улучшение производительности в var и std для nullable типов данных (GH 48379).

  • Улучшение производительности при итерации по pyarrow и nullable типам данных (GH 49825, GH 49851)

  • Улучшения производительности для read_sas() (GH 47403, GH 47405, GH 47656, GH 48502)

  • Улучшение памяти в RangeIndex.sort_values() (GH 48801)

  • Улучшение производительности в Series.to_numpy() if copy=True избегая двойного копирования (GH 24345)

  • Улучшение производительности в Series.rename() с MultiIndex (GH 21055)

  • Улучшение производительности в DataFrameGroupBy и SeriesGroupBy когда by является категориальным типом и sort=False (GH 48976)

  • Улучшение производительности в DataFrameGroupBy и SeriesGroupBy когда by является категориальным типом и observed=False (GH 49596)

  • Улучшение производительности в read_stata() с параметром index_col установлено в None (по умолчанию). Теперь индекс будет RangeIndex вместо Int64Index (GH 49745)

  • Улучшение производительности в merge() при слиянии не по индексу - новый индекс теперь будет RangeIndex вместо Int64Index (GH 49478)

  • Улучшение производительности в DataFrame.to_dict() и Series.to_dict() при использовании любых необъектных типов данных (GH 46470)

  • Улучшение производительности в read_html() когда есть несколько таблиц (GH 49929)

  • Улучшение производительности в Period конструктор при создании из строки или целого числа (GH 38312)

  • Улучшение производительности в to_datetime() при использовании '%Y%m%d' формат (GH 17410)

  • Улучшение производительности в to_datetime() когда формат задан или может быть выведен (GH 50465)

  • Улучшение производительности в Series.median() для nullable типов данных (GH 50838)

  • Улучшение производительности в read_csv() при передаче to_datetime() лямбда-функция для date_parser и входные данные имеют смещённые временные зоны (GH 35296)

  • Улучшение производительности в isna() и isnull() (GH 50658)

  • Улучшение производительности в SeriesGroupBy.value_counts() с категориальным типом данных (GH 46202)

  • Исправлена утечка ссылки в read_hdf() (GH 37441)

  • Исправлена утечка памяти в DataFrame.to_json() и Series.to_json() при сериализации дат и временных интервалов (GH 40443)

  • Уменьшено использование памяти во многих DataFrameGroupBy методы (GH 51090)

  • Улучшение производительности в DataFrame.round() для целого числа decimal параметр (GH 17254)

  • Улучшение производительности в DataFrame.replace() и Series.replace() при использовании большого словаря для to_replace (GH 6697)

  • Улучшение памяти в StataReader при чтении файлов с возможностью поиска (GH 48922)

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

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

Datetimelike#

  • Ошибка в pandas.infer_freq(), вызывая TypeError при выводе на RangeIndex (GH 47084)

  • Ошибка в to_datetime() некорректное возбуждение OverflowError со строковыми аргументами, соответствующими большим целым числам (GH 50533)

  • Ошибка в to_datetime() вызывал ошибку на недопустимых смещениях с errors='coerce' и infer_datetime_format=True (GH 48633)

  • Ошибка в DatetimeIndex конструктор не смог вызвать исключение, когда tz=None явно указан вместе с учитывающим часовой пояс dtype или данные (GH 48659)

  • Ошибка при вычитании datetime скаляр из DatetimeIndex не удается сохранить оригинальный freq атрибут (GH 48818)

  • Ошибка в pandas.tseries.holiday.Holiday где полуоткрытый интервал дат вызывает несовместимые типы возвращаемых значений из USFederalHolidayCalendar.holidays() (GH 49075)

  • Ошибка в отображении DatetimeIndex и Series и DataFrame с типами данных, учитывающими часовой пояс, с dateutil или zoneinfo часовые пояса вблизи переходов на летнее время (GH 49684)

  • Ошибка в to_datetime() вызывал ValueError при разборе Timestamp, datetime.datetime, datetime.date, или np.datetime64 объекты, когда не-ISO8601 format был передан (GH 49298, GH 50036)

  • Ошибка в to_datetime() вызывал ValueError при разборе пустой строки и переданного не-ISO8601 формата. Теперь пустые строки будут разбираться как NaT, для совместимости с тем, как это делается для форматов ISO8601 (GH 50251)

  • Ошибка в Timestamp показывал UserWarning, который не был доступен пользователям, при разборе не-ISO8601 разделённых строк дат (GH 50232)

  • Ошибка в to_datetime() показывал вводящую в заблуждение ValueError при разборе дат с форматом, содержащим директиву ISO недели и директиву ISO дня недели (GH 50308)

  • Ошибка в Timestamp.round() когда freq аргумент имеет нулевую длительность (например, "0ns"), возвращая некорректные результаты вместо вызова исключения (GH 49737)

  • Ошибка в to_datetime() не вызывал ValueError когда был передан неверный формат и errors был 'ignore' или 'coerce' (GH 50266)

  • Ошибка в DateOffset выбрасывал TypeError при создании с миллисекундами и другим аргументом сверхдневного уровня (GH 49897)

  • Ошибка в to_datetime() не вызывал ValueError при разборе строки с десятичной датой в формате '%Y%m%d' (GH 50051)

  • Ошибка в to_datetime() не преобразовывал None to NaT при разборе строк дат со смещением в формате ISO8601 (GH 50071)

  • Ошибка в to_datetime() не возвращал входные данные при разборе строки даты вне допустимого диапазона с errors='ignore' и format='%Y%m%d' (GH 14487)

  • Ошибка в to_datetime() преобразовывал временные зоны без учета часового пояса datetime.datetime в учитывающие часовой пояс при разборе строк с информацией о часовом поясе, формате ISO8601 и utc=False (GH 50254)

  • Ошибка в to_datetime() выбрасывал ValueError при парсинге дат в формате ISO8601, где некоторые значения не были дополнены нулями (GH 21422)

  • Ошибка в to_datetime() давал некорректные результаты при использовании format='%Y%m%d' и errors='ignore' (GH 26493)

  • Ошибка в to_datetime() не удавалось разобрать строки дат 'today' и 'now' if format не был ISO8601 (GH 50359)

  • Ошибка в Timestamp.utctimetuple() вызов TypeError (GH 32174)

  • Ошибка в to_datetime() вызывал ValueError при разборе смещенных временных зон Timestamp с errors='ignore' (GH 50585)

  • Ошибка в to_datetime() неправильно обрабатывал входные данные с плавающей точкой в пределах 1 unit границ переполнения (GH 50183)

  • Ошибка в to_datetime() с единицей “Y” или “M” даёт некорректные результаты, не совпадающие с поточечными Timestamp результаты (GH 50870)

  • Ошибка в Series.interpolate() и DataFrame.interpolate() с типами datetime или timedelta, ошибочно вызывая ValueError (GH 11312)

  • Ошибка в to_datetime() не возвращал входные данные с errors='ignore' когда входные данные были вне допустимого диапазона (GH 50587)

  • Ошибка в DataFrame.from_records() когда задан DataFrame ввод с колонками datetime64 с информацией о часовом поясе некорректно удаляет информацию о часовом поясе (GH 51162)

  • Ошибка в to_datetime() вызывал decimal.InvalidOperation при разборе строк дат с errors='coerce' (GH 51084)

  • Ошибка в to_datetime() с обоими unit и origin указанный возвращает некорректные результаты (GH 42624)

  • Ошибка в Series.astype() и DataFrame.astype() при преобразовании объекта типа object, содержащего даты и время с учетом часового пояса или строки, в datetime64[ns] неправильная локализация как UTC вместо вызова TypeError (GH 50140)

  • Ошибка в DataFrameGroupBy.quantile() и SeriesGroupBy.quantile() с datetime или timedelta dtypes, дающими некорректные результаты для групп, содержащих NaT (GH 51373)

  • Ошибка в DataFrameGroupBy.quantile() и SeriesGroupBy.quantile() некорректно вызывается с PeriodDtype или DatetimeTZDtype (GH 51373)

Timedelta#

  • Ошибка в to_timedelta() вызов ошибки, когда входные данные имеют nullable dtype Float64 (GH 48796)

  • Ошибка в Timedelta конструктор некорректно вызывал ошибку вместо возврата NaT когда задан np.timedelta64("nat") (GH 48898)

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

  • Ошибка в Timedelta сравнения с очень большими datetime.timedelta объекты некорректно вызывают OutOfBoundsTimedelta (GH 49021)

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

  • Ошибка в Series.astype() и DataFrame.astype() с object-dtype, содержащим несколько объектов с учетом часового пояса datetime объекты с разнородными часовыми поясами в DatetimeTZDtype неправильное возникновение (GH 32581)

  • Ошибка в to_datetime() не удавалось разобрать строки дат с названием часового пояса, когда format был указан с %Z (GH 49748)

  • Улучшенное сообщение об ошибке при передаче недопустимых значений в ambiguous параметр в Timestamp.tz_localize() (GH 49565)

  • Ошибка в разборе строк, некорректно разрешающая Timestamp быть созданным с недопустимым часовым поясом, что вызывало ошибку при попытке печати (GH 50668)

  • Исправлено сообщение TypeError в objects_to_datetime64ns() для информирования о том, что DatetimeIndex имеет смешанные часовые пояса (GH 50974)

Числовой#

  • Ошибка в DataFrame.add() нельзя применить ufunc, когда входные данные содержат смешанные типы DataFrame и Series (GH 39853)

  • Ошибка в арифметических операциях над Series не распространяет маску при комбинировании масок типов данных и numpy типов данных (GH 45810, GH 42630)

  • Ошибка в DataFrame.sem() и Series.sem() где ошибочный TypeError всегда вызывал исключение при использовании данных, поддерживаемых ArrowDtype (GH 49759)

  • Ошибка в Series.__add__() приведение к объекту для списка и маскированного Series (GH 22962)

  • Ошибка в mode() где dropna=False не учитывалось, когда было NA значения (GH 50982)

  • Ошибка в DataFrame.query() с engine="numexpr" и имена столбцов min или max вызовет TypeError (GH 50937)

  • Ошибка в DataFrame.min() и DataFrame.max() с данными, учитывающими часовой пояс, содержащими pd.NaT и axis=1 возвращал неверные результаты (GH 51242)

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

  • Ошибка при построении Series с int64 dtype из списка строк вызывает ошибку вместо приведения типа (GH 44923)

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

  • Ошибка в DataFrame.eval() некорректно вызывал AttributeError когда в вызове функции есть отрицательные значения (GH 46471)

  • Ошибка в Series.convert_dtypes() не преобразует dtype в nullable dtype, когда Series содержит NA и имеет тип данных object (GH 48791)

  • Ошибка, где любой ExtensionDtype подкласс с kind="M" интерпретировался бы как тип часового пояса (GH 34986)

  • Ошибка в arrays.ArrowExtensionArray который вызовет NotImplementedError при передаче последовательности строк или бинарных данных (GH 49172)

  • Ошибка в Series.astype() вызов pyarrow.ArrowInvalid при преобразовании из строкового типа данных не-pyarrow в числовой тип pyarrow (GH 50430)

  • Ошибка в DataFrame.astype() изменение входного массива на месте при преобразовании в string и copy=False (GH 51073)

  • Ошибка в Series.to_numpy() преобразование в массив NumPy перед применением na_value (GH 48951)

  • Ошибка в DataFrame.astype() без копирования данных при преобразовании в тип pyarrow (GH 50984)

  • Ошибка в to_datetime() не учитывал exact аргумент, когда format был в формате ISO8601 (GH 12649)

  • Ошибка в TimedeltaArray.astype() вызов TypeError при преобразовании в тип длительности pyarrow (GH 49795)

  • Ошибка в DataFrame.eval() и DataFrame.query() вызов исключения для типов данных расширенных массивов (GH 29618, GH 50261, GH 31913)

  • Ошибка в Series() не копирует данные при создании из Index и dtype равно dtype из Index (GH 52008)

Строки#

  • Ошибка в pandas.api.types.is_string_dtype() который не вернёт True для StringDtype или ArrowDtype с pyarrow.string() (GH 15585)

  • Ошибка при преобразовании строковых типов данных в "datetime64[ns]" или "timedelta64[ns]" с некорректным вызовом TypeError (GH 36153)

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

Interval#

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

  • Ошибка в DataFrame.__setitem__() вызывал исключение, когда индексатор является DataFrame с boolean тип данных (GH 47125)

  • Ошибка в DataFrame.reindex() заполнение неправильными значениями при индексировании столбцов и индекса для uint типы данных (GH 48184)

  • Ошибка в DataFrame.loc() при установке DataFrame с разными типами данных, приводящими значения к единому типу данных (GH 50467)

  • Ошибка в DataFrame.sort_values() где None не возвращался, когда by является пустым списком и inplace=True (GH 50643)

  • Ошибка в DataFrame.loc() приведение типов данных при установке значений с помощью индексатора списка (GH 49159)

  • Ошибка в Series.loc() вызов ошибки для выхода за границы конечного индекса среза (GH 50161)

  • Ошибка в DataFrame.loc() вызов ValueError со всеми False bool индексатор и пустой объект (GH 51450)

  • Ошибка в DataFrame.loc() вызов ValueError с bool индексатор и MultiIndex (GH 47687)

  • Ошибка в DataFrame.loc() вызов IndexError при установке значений для столбца на основе pyarrow с нескалярным индексатором (GH 50085)

  • Ошибка в DataFrame.__getitem__(), Series.__getitem__(), DataFrame.__setitem__() и Series.__setitem__() при индексировании по индексам с расширенными типами данных с плавающей точкой (Float64 & Float64) или сложные типы данных с использованием целых чисел (GH 51053)

  • Ошибка в DataFrame.loc() изменяющий объект при установке несовместимого значения с пустым индексатором (GH 45981)

  • Ошибка в DataFrame.__setitem__() вызов ValueError когда правая сторона равна DataFrame с MultiIndex столбцы (GH 49121)

  • Ошибка в DataFrame.reindex() приведение типа данных к object когда DataFrame имеет один столбец типа extension array при переиндексации columns и index (GH 48190)

  • Ошибка в DataFrame.iloc() вызов IndexError когда индексатор является Series с числовым типом данных extension array dtype (GH 49521)

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

  • Ошибка в DataFrame.compare() не распознает различия при сравнении NA со значением в обнуляемых типах данных (GH 48939)

  • Ошибка в Series.rename() с MultiIndex потеря типов данных массивов расширений (GH 21055)

  • Ошибка в DataFrame.isetitem() приведение типов данных расширенных массивов в DataFrame в объект (GH 49922)

  • Ошибка в Series.__getitem__() возвращая поврежденный объект при выборе из пустого объекта на основе pyarrow (GH 51734)

  • Ошибка в BusinessHour приведёт к созданию DatetimeIndex завершаться ошибкой, когда в индексе не было указано время открытия (GH 49835)

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

  • Ошибка в Index.equals() вызов TypeError когда Index состоит из кортежей, содержащих NA (GH 48446)

  • Ошибка в Series.map() вызывало некорректный результат, когда данные содержали NaN и использовалось отображение defaultdict (GH 48813)

  • Ошибка в NA вызов TypeError вместо возврата NA при выполнении бинарной операции с bytes объект (GH 49108)

  • Ошибка в DataFrame.update() с overwrite=False вызов TypeError когда self имеет столбец с NaT значения и столбец отсутствует в other (GH 16713)

  • Ошибка в Series.replace() вызов RecursionError при замене значения в объектном типе данных Series содержащий NA (GH 47480)

  • Ошибка в Series.replace() вызов RecursionError при замене значения в числовом Series с NA (GH 50758)

MultiIndex#

  • Ошибка в MultiIndex.get_indexer() не совпадающий NaN значения (GH 29252, GH 37222, GH 38623, GH 42883, GH 43222, GH 46173, GH 48905)

  • Ошибка в MultiIndex.argsort() вызов TypeError когда индекс содержит NA (GH 48495)

  • Ошибка в MultiIndex.difference() потеря типа данных extension array (GH 48606)

  • Ошибка в MultiIndex.set_levels вызов IndexError при установке пустого уровня (GH 48636)

  • Ошибка в MultiIndex.unique() потеря типа данных extension array (GH 48335)

  • Ошибка в MultiIndex.intersection() потеря массива расширения (GH 48604)

  • Ошибка в MultiIndex.union() потеря массива расширения (GH 48498, GH 48505, GH 48900)

  • Ошибка в MultiIndex.union() отсутствие сортировки при sort=None и наличии пропущенных значений в индексе (GH 49010)

  • Ошибка в MultiIndex.append() не проверяя имена на равенство (GH 48288)

  • Ошибка в MultiIndex.symmetric_difference() потеря массива расширения (GH 48607)

  • Ошибка в MultiIndex.join() потеря типов данных при MultiIndex имеет дубликаты (GH 49830)

  • Ошибка в MultiIndex.putmask() потеря массива расширения (GH 49830)

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

I/O#

  • Ошибка в read_sas() вызвал фрагментацию DataFrame и вызвало errors.PerformanceWarning (GH 48595)

  • Улучшенное сообщение об ошибке в read_excel() включая имя проблемного листа при возникновении исключения при чтении файла (GH 48706)

  • Ошибка при сериализации подмножества данных на основе PyArrow, которая сериализовала бы все данные вместо подмножества (GH 42600)

  • Ошибка в read_sql_query() игнорируя dtype аргумент, когда chunksize указан и результат пуст (GH 50245)

  • Ошибка в read_csv() для однострочного csv с меньшим количеством столбцов, чем names вызвано errors.ParserError с engine="c" (GH 47566)

  • Ошибка в read_json() вызов исключения с orient="table" и NA значение (GH 40255)

  • Ошибка в отображении string типы данных не показывают опцию хранения (GH 50099)

  • Ошибка в DataFrame.to_string() с header=False который выводил имя индекса на той же строке, что и первая строка данных (GH 49230)

  • Ошибка в DataFrame.to_string() игнорирование форматирования float для массивов расширений (GH 39336)

  • Исправлена утечка памяти, вызванная инициализацией внутреннего модуля JSON (GH 49222)

  • Исправлена проблема, когда json_normalize() неправильно удалял начальные символы из названий столбцов, которые совпадали с sep аргумент (GH 49861)

  • Ошибка в read_csv() ненужное переполнение для типа данных массива расширений при содержании NA (GH 32134)

  • Ошибка в DataFrame.to_dict() не преобразуя NA to None (GH 50795)

  • Ошибка в DataFrame.to_json() где происходил сбой сегментации при неудачной кодировке строки (#N/A N/A)

  • Ошибка в DataFrame.to_html() с na_rep установить, когда DataFrame содержит нескалярные данные (GH 47103)

  • Ошибка в read_xml() где файлоподобные объекты завершались ошибкой при использовании iterparse (GH 50641)

  • Ошибка в read_csv() когда engine="pyarrow" где encoding параметр обрабатывался некорректно (GH 51302)

  • Ошибка в read_xml() игнорировал повторяющиеся элементы при использовании iterparse (GH 51183)

  • Ошибка в ExcelWriter оставляя файловые дескрипторы открытыми, если во время инициализации произошло исключение (GH 51443)

  • Ошибка в DataFrame.to_parquet() где нестроковые индексы или столбцы вызывали ValueError когда engine="pyarrow" (GH 52036)

Period#

  • Ошибка в Period.strftime() и PeriodIndex.strftime(), вызывая UnicodeDecodeError когда была передана специфичная для локали директива (GH 46319)

  • Ошибка при добавлении Period объект в массив DateOffset объекты, некорректно вызывающие TypeError (GH 50162)

  • Ошибка в Period где передача строки с более высоким разрешением, чем наносекунда, приведет к KeyError вместо отбрасывания дополнительной точности (GH 50417)

  • Ошибка в разборе строк, представляющих недельные периоды, например, "2017-01-23/2017-01-29" как минутную частоту вместо недельной частоты (GH 50803)

  • Ошибка в DataFrameGroupBy.sum(), DataFrameGroupByGroupBy.cumsum(), DataFrameGroupByGroupBy.prod(), DataFrameGroupByGroupBy.cumprod() с PeriodDtype не удалось вызвать TypeError (GH 51040)

  • Ошибка при разборе пустой строки с Period некорректное возбуждение ValueError вместо возврата NaT (GH 51349)

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

  • Ошибка в DataFrame.plot.hist(), не удаляя элементы из weights соответствующий NaN значения в data (GH 48884)

  • ax.set_xlim иногда вызывал UserWarning которые пользователи не могли исправить из-за set_xlim не принимает аргументы парсинга — теперь конвертер использует Timestamp() вместо (GH 49148)

Groupby/resample/rolling#

  • Ошибка в ExponentialMovingWindow с online не вызывал NotImplementedError для неподдерживаемых операций (GH 48834)

  • Ошибка в DataFrameGroupBy.sample() вызывает ValueError когда объект пуст (GH 48459)

  • Ошибка в Series.groupby() вызывает ValueError когда элемент индекса равен имени индекса (GH 48567)

  • Ошибка в DataFrameGroupBy.resample() дает нестабильные результаты при передаче пустого DataFrame (GH 47705)

  • Ошибка в DataFrameGroupBy и SeriesGroupBy не будет включать ненаблюдаемые категории в результат при группировке по категориальным индексам (GH 49354)

  • Ошибка в DataFrameGroupBy и SeriesGroupBy изменял порядок результатов в зависимости от входного индекса при группировке по категориальным переменным (GH 49223)

  • Ошибка в DataFrameGroupBy и SeriesGroupBy при группировке по категориальным данным сортировало бы значения результата, даже при использовании с sort=False (GH 42482)

  • Ошибка в DataFrameGroupBy.apply() и SeriesGroupBy.apply с as_index=False не будет пытаться выполнить вычисление без использования ключей группировки, когда их использование завершилось сбоем с TypeError (GH 49256)

  • Ошибка в DataFrameGroupBy.describe() будет описывать ключи группы (GH 49256)

  • Ошибка в SeriesGroupBy.describe() с as_index=False будет иметь неправильную форму (GH 49256)

  • Ошибка в DataFrameGroupBy и SeriesGroupBy с dropna=False удалял значения NA, когда группировщик был категориальным (GH 36327)

  • Ошибка в SeriesGroupBy.nunique() неправильно вызывал, когда группировщик был пустой категорией и observed=True (GH 21334)

  • Ошибка в SeriesGroupBy.nth() вызывал ошибку, когда группировщик содержал значения NA после выборки из DataFrameGroupBy (GH 26454)

  • Ошибка в DataFrame.groupby() не будет включать Grouper указанный key в результате, когда as_index=False (GH 50413)

  • Ошибка в DataFrameGroupBy.value_counts() вызывал ошибку при использовании с TimeGrouper (GH 50486)

  • Ошибка в Resampler.size() вызвал широкий DataFrame будет возвращён вместо Series с MultiIndex (GH 46826)

  • Ошибка в DataFrameGroupBy.transform() и SeriesGroupBy.transform() неправильно вызывал исключение, когда группировщик имел axis=1 для "idxmin" и "idxmax" аргументы (GH 45986)

  • Ошибка в DataFrameGroupBy вызывало ошибку при использовании с пустым DataFrame, категориальным группировщиком и dropna=False (GH 50634)

  • Ошибка в SeriesGroupBy.value_counts() не учитывал sort=False (GH 50482)

  • Ошибка в DataFrameGroupBy.resample() вызывает KeyError при получении результата из списка ключей при ресемплинге по временному индексу (GH 50840)

  • Ошибка в DataFrameGroupBy.transform() и SeriesGroupBy.transform() неправильно вызывал исключение, когда группировщик имел axis=1 для "ngroup" аргумент (GH 45986)

  • Ошибка в DataFrameGroupBy.describe() давал некорректные результаты, когда данные имели дублирующиеся столбцы (GH 50806)

  • Ошибка в DataFrameGroupBy.agg() с engine="numba" не соблюдая as_index=False (GH 51228)

  • Ошибка в DataFrameGroupBy.agg(), SeriesGroupBy.agg(), и Resampler.agg() игнорировал аргументы при передаче списка функций (GH 50863)

  • Ошибка в DataFrameGroupBy.ohlc() игнорируя as_index=False (GH 51413)

  • Ошибка в DataFrameGroupBy.agg() после выбора подмножества столбцов (например, .groupby(...)[["a", "b"]]) не будет включать группировки в результат (GH 51186)

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

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

  • Ошибка в Series.astype() при преобразовании SparseDtype с datetime64[ns] подтип в int64 вызывает ошибку типа данных, несовместимую с неразреженным поведением (GH 49631,:issue:50087)

  • Ошибка в Series.astype() при преобразовании из datetime64[ns] to Sparse[datetime64[ns]] неправильное возникновение (GH 50082)

  • Ошибка в Series.sparse.to_coo() вызов SystemError когда MultiIndex содержит ExtensionArray (GH 50996)

ExtensionArray#

  • Ошибка в Series.mean() переполнение без необходимости с нуллифицируемыми целыми числами (GH 48378)

  • Ошибка в Series.tolist() для nullable dtypes возвращает скаляры numpy вместо скаляров python (GH 49890)

  • Ошибка в Series.round() для типов данных на основе pyarrow, вызывающих AttributeError (GH 50437)

  • Ошибка при объединении пустого DataFrame с ExtensionDtype с другим DataFrame с тем же ExtensionDtype, результирующий тип данных превратился в object (GH 48510)

  • Ошибка в array.PandasArray.to_numpy() вызов исключения с NA значение, когда na_value указан (GH 40638)

  • Ошибка в api.types.is_numeric_dtype() где пользовательский ExtensionDtype не возвращал True if _is_numeric возвращён True (GH 50563)

  • Ошибка в api.types.is_integer_dtype(), api.types.is_unsigned_integer_dtype(), api.types.is_signed_integer_dtype(), api.types.is_float_dtype() где пользовательский ExtensionDtype не возвращал True if kind возвращал соответствующий тип NumPy (GH 50667)

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

  • Ошибка при установке нестрокового значения в StringArray вызов ValueError вместо TypeError (GH 49632)

  • Ошибка в DataFrame.reindex() не соблюдение значения по умолчанию copy=True ключевое слово в случае столбцов с ExtensionDtype (и, как следствие, также выбор нескольких столбцов с getitem ([]) не приводил к корректному созданию копии) (GH 51197)

  • Ошибка в ArrowExtensionArray логические операции & и | вызов KeyError (GH 51688)

Styler#

Метаданные#

Другие#

  • Ошибка в некорректном принятии строк dtype, содержащих "[pyarrow]" более одного раза (GH 51548)

  • Ошибка в Series.searchsorted() непоследовательное поведение при принятии DataFrame в качестве параметра value (GH 49620)

  • Ошибка в array() не удалось вызвать исключение на DataFrame входные данные (GH 51167)

Участники#

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

  • 5j9 +

  • ABCPAN-rank +

  • Aarni Koskela +

  • Aashish KC +

  • Абубекер Мохаммед +

  • Adam Mróz +

  • Adam Ormondroyd +

  • Aditya Anulekh +

  • Ahmed Ibrahim

  • Акшай Баббар +

  • Алекса Радойчич +

  • Alex +

  • Алекс Бузене +

  • Alex Kirko

  • Allison Kwan +

  • Amay Patel +

  • Ambuj Pawar +

  • Amotz +

  • Andreas Schwab +

  • Andrew Chen +

  • Anton Shevtsov

  • Antonio Ossa Guerra +

  • Antonio Ossa-Guerra +

  • Anushka Bishnoi +

  • Arda Kosar

  • Armin Berres

  • Asadullah Naeem +

  • Asish Mahapatra

  • Bailey Lissington +

  • BarkotBeyene

  • Ben Beasley

  • Bhavesh Rajendra Patil +

  • Bibek Jha +

  • Билл +

  • Bishwas +

  • CarlosGDCJ +

  • Carlotta Fabian +

  • Chris Roth +

  • Chuck Cadman +

  • Corralien +

  • DG +

  • Dan Hendry +

  • Daniel Isaac

  • David Kleindienst +

  • David Poznik +

  • David Rudel +

  • DavidKleindienst +

  • Dea María Léon +

  • Дипак Сирохивал +

  • Dennis Chukwunta

  • Douglas Lohmann +

  • Dries Schaumont

  • Dustin K +

  • Edoardo Abati +

  • Eduardo Chaves +

  • Ege Özgüroğlu +

  • Ekaterina Borovikova +

  • Eli Schwartz +

  • Elvis Lim +

  • Emily Taylor +

  • Emma Carballal Haire +

  • Эрик Уэлч +

  • Fangchen Li

  • Florian Hofstetter +

  • Flynn Owen +

  • Фредрик Эрландссон +

  • Gaurav Sheni

  • Georeth Chow +

  • George Munyoro +

  • Guilherme Beltramini

  • Гульнур Баймухамбетова +

  • H L +

  • Hans

  • Hatim Zahid +

  • HighYoda +

  • Hiki +

  • Himanshu Wagh +

  • Hugo van Kemenade +

  • Idil Ismiguzel +

  • Ирв Ластиг

  • Isaac Chung

  • Isaac Virshup

  • Дж.Х.М. Дарбишир

  • JHM Darbyshire (iMac)

  • JMBurley

  • Jaime Di Cristina

  • Jan Koch

  • JanVHII +

  • Janosh Riebesell

  • JasmandeepKaur +

  • Jeremy Tuloup

  • Jessica M +

  • Jonas Haag

  • Joris Van den Bossche

  • João Meirelles +

  • Julia Aoun +

  • Justus Magin +

  • Кан Су Мин +

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

  • Khor Chean Wei

  • Киан Элиаси

  • Kostya Farber +

  • KotlinIsland +

  • Лакмал Пиннадуваге +

  • Lakshya A Agrawal +

  • Lawrence Mitchell +

  • Levi Ob +

  • Loic Diridollou

  • Lorenzo Vainigli +

  • Luca Pizzini +

  • Лукас Дамо +

  • Люк Мэнли

  • Madhuri Patil +

  • Марк Гарсия

  • Marco Edward Gorelli

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

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

  • Maren Westermann +

  • Maria Stazherova +

  • Marie K +

  • Marielle +

  • Mark Harfouche +

  • Marko Pacak +

  • Martin +

  • Matheus Cerqueira +

  • Matheus Pedroni +

  • Matteo Raso +

  • Мэтью Рёшке

  • MeeseeksMachine +

  • Mehdi Mohammadi +

  • Michael Harris +

  • Michael Mior +

  • Natalia Mokeeva +

  • Neal Muppidi +

  • Nick Crews

  • Nishu Choudhary +

  • Noa Tamir

  • Noritada Kobayashi

  • Omkar Yadav +

  • P. Talley +

  • Pablo +

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

  • Парфе Гасана

  • Patrick Hoefler

  • Pedro Nacht +

  • Philip +

  • Пьетро Баттистон

  • Pooja Subramaniam +

  • Pranav Saibhushan Ravuri +

  • Pranav. P. A +

  • Ральф Гоммерс +

  • RaphSku +

  • Richard Shadrach

  • Robsdedude +

  • Роджер

  • Roger Thomas

  • RogerThomas +

  • SFuller4 +

  • Salahuddin +

  • Sam Rao

  • Sean Patrick Malloy +

  • Sebastian Roll +

  • Shantanu

  • Shashwat +

  • Шашват Агравал +

  • Shiko Wamwea +

  • Shoham Debnath

  • Shubhankar Lohani +

  • Siddhartha Gandhi +

  • Simon Hawkins

  • Soumik Dutta +

  • Sowrov Talukder +

  • Stefanie Molin

  • Stefanie Senger +

  • Stepfen Shawn +

  • Steven Rotondo

  • Stijn Van Hoey

  • Sudhansu +

  • Sven

  • Sylvain MARIE

  • Sylvain Marié

  • Tabea Kossen +

  • Тейлор Паккард

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

  • Thierry Moisan

  • Томас Х +

  • Thomas Li

  • Torsten Wörtwein

  • Tsvika S +

  • Tsvika Shapira +

  • Vamsi Verma +

  • Vinicius Akira +

  • William Andrea

  • William Ayd

  • William Blum +

  • Wilson Xing +

  • Xiao Yuan +

  • Xnot +

  • Yasin Tatar +

  • Yuanhao Geng

  • Yvan Cywan +

  • Zachary Moon +

  • Zhengbo Wang +

  • abonte +

  • adrienpacifico +

  • alm

  • amotzop +

  • andyjessen +

  • anonmouse1 +

  • bang128 +

  • Бишвас Джа +

  • calhockemeyer +

  • carla-alves-24 +

  • carlotta +

  • casadipietra +

  • catmar22 +

  • cfabian +

  • codamuse +

  • dataxerik

  • davidleon123 +

  • dependabot[bot] +

  • fdrocha +

  • github-actions[bot]

  • himanshu_wagh +

  • iofall +

  • jakirkham +

  • jbrockmendel

  • jnclt +

  • joelchen +

  • joelsonoda +

  • joshuabello2550

  • joycewamwea +

  • kathleenhang +

  • krasch +

  • ltoniazzi +

  • luke396 +

  • milosz-martynow +

  • minat-hub +

  • mliu08 +

  • monosans +

  • nealxm

  • никитавед +

  • paradox-lab +

  • partev

  • raisadz +

  • ram vikram singh +

  • rebecca-palmer

  • sarvaSanjay +

  • seljaks +

  • silviaovo +

  • smij720 +

  • soumilbaldota +

  • stellalin7 +

  • strawberry beach sandals +

  • tmoschou +

  • uzzell +

  • yqyqyq-W +

  • yun +

  • Адам Липпаи

  • 김동현 (Daniel Donghyun Kim) +