Что нового в версии 1.1.0 (28 июля 2020)#

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

Улучшения#

KeyErrors, вызванные loc, указывают отсутствующие метки#

Ранее, если метки отсутствовали для .loc вызов, было вызвано исключение KeyError с сообщением, что это больше не поддерживается.

Теперь сообщение об ошибке также включает список отсутствующих меток (максимум 10 элементов, ширина отображения 80 символов). См. GH 34272.

Все dtypes теперь можно преобразовать в StringDtype#

Ранее объявление или преобразование в StringDtype было в целом возможно только если данные уже были только str или наноподобный (GH 31204). StringDtype теперь работает во всех ситуациях, где astype(str) или dtype=str работать:

Например, нижеследующее теперь работает:

In [1]: ser = pd.Series([1, "abc", np.nan], dtype="string")

In [2]: ser
Out[2]: 
0       1
1     abc
2    
Length: 3, dtype: string

In [3]: ser[0]
Out[3]: '1'

In [4]: pd.Series([1, 2, np.nan], dtype="Int64").astype("string")
Out[4]: 
0       1
1       2
2    
Length: 3, dtype: string

Частичное строковое срезание не монотонного PeriodIndex#

PeriodIndex теперь поддерживает частичное строковое срезывание для немонотонных индексов, отражая DatetimeIndex поведение (GH 31096)

Например:

In [5]: dti = pd.date_range("2014-01-01", periods=30, freq="30D")

In [6]: pi = dti.to_period("D")

In [7]: ser_monotonic = pd.Series(np.arange(30), index=pi)

In [8]: shuffler = list(range(0, 30, 2)) + list(range(1, 31, 2))

In [9]: ser = ser_monotonic.iloc[shuffler]

In [10]: ser
Out[10]: 
2014-01-01     0
2014-03-02     2
2014-05-01     4
2014-06-30     6
2014-08-29     8
              ..
2015-09-23    21
2015-11-22    23
2016-01-21    25
2016-03-21    27
2016-05-20    29
Freq: D, Length: 30, dtype: int64
In [11]: ser["2014"]
Out[11]: 
2014-01-01     0
2014-03-02     2
2014-05-01     4
2014-06-30     6
2014-08-29     8
2014-10-28    10
2014-12-27    12
2014-01-31     1
2014-04-01     3
2014-05-31     5
2014-07-30     7
2014-09-28     9
2014-11-27    11
Freq: D, Length: 13, dtype: int64

In [12]: ser.loc["May 2015"]
Out[12]: 
2015-05-26    17
Freq: D, Length: 1, dtype: int64

Сравнение двух DataFrame или два Series и суммируем различия#

Мы добавили DataFrame.compare() и Series.compare() для сравнения двух DataFrame или два Series (GH 30429)

In [13]: df = pd.DataFrame(
   ....:     {
   ....:         "col1": ["a", "a", "b", "b", "a"],
   ....:         "col2": [1.0, 2.0, 3.0, np.nan, 5.0],
   ....:         "col3": [1.0, 2.0, 3.0, 4.0, 5.0]
   ....:     },
   ....:     columns=["col1", "col2", "col3"],
   ....: )
   ....: 

In [14]: df
Out[14]: 
  col1  col2  col3
0    a   1.0   1.0
1    a   2.0   2.0
2    b   3.0   3.0
3    b   NaN   4.0
4    a   5.0   5.0

[5 rows x 3 columns]
In [15]: df2 = df.copy()

In [16]: df2.loc[0, 'col1'] = 'c'

In [17]: df2.loc[2, 'col3'] = 4.0

In [18]: df2
Out[18]: 
  col1  col2  col3
0    c   1.0   1.0
1    a   2.0   2.0
2    b   3.0   4.0
3    b   NaN   4.0
4    a   5.0   5.0

[5 rows x 3 columns]
In [19]: df.compare(df2)
Out[19]: 
  col1       col3      
  self other self other
0    a     c  NaN   NaN
2  NaN   NaN  3.0   4.0

[2 rows x 4 columns]

См. Руководство пользователя для получения дополнительной информации.

Разрешить NA в ключе группировки#

С groupby , мы добавили dropna ключевое слово для DataFrame.groupby() и Series.groupby() чтобы разрешить NA значения в ключах групп. Пользователи могут определять dropna to False если они хотят включить NA значения в ключах groupby. По умолчанию установлено в True для dropna для сохранения обратной совместимости (GH 3729)

In [20]: df_list = [[1, 2, 3], [1, None, 4], [2, 1, 3], [1, 2, 2]]

In [21]: df_dropna = pd.DataFrame(df_list, columns=["a", "b", "c"])

In [22]: df_dropna
Out[22]: 
   a    b  c
0  1  2.0  3
1  1  NaN  4
2  2  1.0  3
3  1  2.0  2

[4 rows x 3 columns]
# Default ``dropna`` is set to True, which will exclude NaNs in keys
In [23]: df_dropna.groupby(by=["b"], dropna=True).sum()
Out[23]: 
     a  c
b        
1.0  2  3
2.0  2  5

[2 rows x 2 columns]

# In order to allow NaN in keys, set ``dropna`` to False
In [24]: df_dropna.groupby(by=["b"], dropna=False).sum()
Out[24]: 
     a  c
b        
1.0  2  3
2.0  2  5
NaN  1  4

[3 rows x 2 columns]

Настройка по умолчанию для dropna аргумент является True что означает NA не включены в ключи групп.

Сортировка с ключами#

Мы добавили key аргумент для DataFrame и Series методы сортировки, включая DataFrame.sort_values(), DataFrame.sort_index(), Series.sort_values(), и Series.sort_index(). key может быть любой вызываемой функцией, которая применяется по столбцам к каждому столбцу, используемому для сортировки, перед выполнением сортировки (GH 27237). См. sort_values с ключами и sort_index с ключами для получения дополнительной информации.

In [25]: s = pd.Series(['C', 'a', 'B'])

In [26]: s
Out[26]: 
0    C
1    a
2    B
Length: 3, dtype: object
In [27]: s.sort_values()
Out[27]: 
2    B
0    C
1    a
Length: 3, dtype: object

Обратите внимание, как это отсортировано с заглавными буквами первыми. Если мы применим Series.str.lower() метод, мы получаем

In [28]: s.sort_values(key=lambda x: x.str.lower())
Out[28]: 
1    a
2    B
0    C
Length: 3, dtype: object

При применении к DataFrame, ключ применяется по столбцам ко всем столбцам или подмножеству, если by указан, например.

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

In [30]: df
Out[30]: 
   a  b
0  C  1
1  C  2
2  a  3
3  a  4
4  B  5
5  B  6

[6 rows x 2 columns]
In [31]: df.sort_values(by=['a'], key=lambda col: col.str.lower())
Out[31]: 
   a  b
2  a  3
3  a  4
4  B  5
5  B  6
0  C  1
1  C  2

[6 rows x 2 columns]

Для получения дополнительных сведений см. примеры и документацию в DataFrame.sort_values(), Series.sort_values(), и sort_index().

Поддержка аргумента fold в конструкторе Timestamp#

Timestamp: теперь поддерживает только ключевое слово fold согласно PEP 495 аналогично родительскому datetime.datetime класс. Он поддерживает как принятие fold в качестве аргумента инициализации, так и вывод fold из других аргументов конструктора (GH 25057, GH 31338). Поддержка ограничена dateutil часовые пояса как pytz не поддерживает fold.

Например:

In [32]: ts = pd.Timestamp("2019-10-27 01:30:00+00:00")

In [33]: ts.fold
Out[33]: 0
In [34]: ts = pd.Timestamp(year=2019, month=10, day=27, hour=1, minute=30,
   ....:                   tz="dateutil/Europe/London", fold=1)
   ....: 

In [35]: ts
Out[35]: Timestamp('2019-10-27 01:30:00+0000', tz='dateutil//usr/share/zoneinfo/Europe/London')

Для получения дополнительной информации о работе со сгибом, см. Раздел Fold в руководстве пользователя.

Анализ формата с учетом часового пояса с разными часовыми поясами в to_datetime#

to_datetime() теперь поддерживает парсинг форматов, содержащих названия часовых поясов (%Z) и смещения UTC (%z) из разных часовых поясов, а затем преобразуют их в UTC, установив utc=True. Это вернет DatetimeIndex с часовым поясом UTC, в отличие от Index с object dtype, если utc=True не установлен (GH 32792).

Например:

In [36]: tz_strs = ["2010-01-01 12:00:00 +0100", "2010-01-01 12:00:00 -0100",
   ....:            "2010-01-01 12:00:00 +0300", "2010-01-01 12:00:00 +0400"]
   ....: 

In [37]: pd.to_datetime(tz_strs, format='%Y-%m-%d %H:%M:%S %z', utc=True)
Out[37]: 
DatetimeIndex(['2010-01-01 11:00:00+00:00', '2010-01-01 13:00:00+00:00',
               '2010-01-01 09:00:00+00:00', '2010-01-01 08:00:00+00:00'],
              dtype='datetime64[ns, UTC]', freq=None)
In[37]: pd.to_datetime(tz_strs, format='%Y-%m-%d %H:%M:%S %z')
Out[37]:
Index([2010-01-01 12:00:00+01:00, 2010-01-01 12:00:00-01:00,
       2010-01-01 12:00:00+03:00, 2010-01-01 12:00:00+04:00],
      dtype='object')

Grouper и resample теперь поддерживают аргументы origin и offset#

Grouper и DataFrame.resample() теперь поддерживает аргументы origin и offset. Это позволяет пользователю контролировать временную метку, по которой производится группировка. (GH 31809)

Бины группировки корректируются на основе начала дня начальной точки временного ряда. Это хорошо работает с частотами, кратными дню (например, 30D) или который делит день (например, 90s или 1min). Но это может создавать несоответствия с некоторыми частотами, которые не соответствуют этому критерию. Чтобы изменить это поведение, теперь можно указать фиксированную метку времени с помощью аргумента origin.

Два аргумента теперь устарели (подробнее в документации DataFrame.resample()):

  • base должен быть заменен на offset.

  • loffset следует заменить прямым добавлением смещения к индексу DataFrame после ресемплирования.

Небольшой пример использования origin:

In [38]: start, end = '2000-10-01 23:30:00', '2000-10-02 00:30:00'

In [39]: middle = '2000-10-02 00:00:00'

In [40]: rng = pd.date_range(start, end, freq='7min')

In [41]: ts = pd.Series(np.arange(len(rng)) * 3, index=rng)

In [42]: ts
Out[42]: 
2000-10-01 23:30:00     0
2000-10-01 23:37:00     3
2000-10-01 23:44:00     6
2000-10-01 23:51:00     9
2000-10-01 23:58:00    12
2000-10-02 00:05:00    15
2000-10-02 00:12:00    18
2000-10-02 00:19:00    21
2000-10-02 00:26:00    24
Freq: 7min, Length: 9, dtype: int64

Ресемплирование с поведением по умолчанию 'start_day' (origin - 2000-10-01 00:00:00):

In [43]: ts.resample('17min').sum()
Out[43]: 
2000-10-01 23:14:00     0
2000-10-01 23:31:00     9
2000-10-01 23:48:00    21
2000-10-02 00:05:00    54
2000-10-02 00:22:00    24
Freq: 17min, Length: 5, dtype: int64

In [44]: ts.resample('17min', origin='start_day').sum()
Out[44]: 
2000-10-01 23:14:00     0
2000-10-01 23:31:00     9
2000-10-01 23:48:00    21
2000-10-02 00:05:00    54
2000-10-02 00:22:00    24
Freq: 17min, Length: 5, dtype: int64

Ресемплирование с фиксированным началом:

In [45]: ts.resample('17min', origin='epoch').sum()
Out[45]: 
2000-10-01 23:18:00     0
2000-10-01 23:35:00    18
2000-10-01 23:52:00    27
2000-10-02 00:09:00    39
2000-10-02 00:26:00    24
Freq: 17min, Length: 5, dtype: int64

In [46]: ts.resample('17min', origin='2000-01-01').sum()
Out[46]: 
2000-10-01 23:24:00     3
2000-10-01 23:41:00    15
2000-10-01 23:58:00    45
2000-10-02 00:15:00    45
Freq: 17min, Length: 4, dtype: int64

При необходимости вы можете настроить интервалы с помощью аргумента offset (a Timedelta) которые будут добавлены к значениям по умолчанию origin.

Полный пример см.: Используйте origin или offset для настройки начала бинов.

fsspec теперь используется для обработки файловой системы#

Для чтения и записи в файловые системы, отличные от локальной, и чтения из HTTP(S), необязательная зависимость fsspec будет использоваться для диспетчеризации операций (GH 33452). Это обеспечит неизменную функциональность для хранилищ S3 и GCS, которые уже поддерживались, а также добавит поддержку нескольких других реализаций хранилищ, таких как Azure Datalake и Blob, SSH, FTP, dropbox и github. Для документации и возможностей см. документация fsspec.

Существующая возможность взаимодействия с S3 и GCS не будет затронута этим изменением, так как fsspec по-прежнему будет загружать те же пакеты, что и раньше.

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

  • Совместимость с matplotlib 3.3.0 (GH 34850)

  • IntegerArray.astype() теперь поддерживает datetime64 тип данных (GH 32538)

  • IntegerArray теперь реализует sum операция (GH 33172)

  • Добавлен pandas.errors.InvalidIndexError (GH 34570).

  • Добавлен DataFrame.value_counts() (GH 5377)

  • Добавлен pandas.api.indexers.FixedForwardWindowIndexer() класс для поддержки окон с опережением во время rolling операции.

  • Добавлен pandas.api.indexers.VariableOffsetWindowIndexer() класс для поддержки rolling операции с нефиксированными смещениями (GH 34994)

  • describe() теперь включает datetime_is_numeric ключевое слово для управления тем, как суммируются столбцы с датой и временем (GH 30164, GH 34798)

  • Styler теперь может отображать CSS более эффективно, когда несколько ячеек имеют одинаковое оформление (GH 30876)

  • highlight_null() теперь принимает subset аргумент (GH 31345)

  • При прямой записи в соединение sqlite DataFrame.to_sql() теперь поддерживает multi метод (GH 29921)

  • pandas.errors.OptionError теперь доступен в pandas.errors (GH 27553)

  • Добавлен api.extensions.ExtensionArray.argmax() и api.extensions.ExtensionArray.argmin() (GH 24382)

  • timedelta_range() теперь будет определять частоту при передаче start, stop, и periods (GH 32377)

  • Позиционное срезывание на IntervalIndex теперь поддерживает срезы с step > 1 (GH 31658)

  • Series.str теперь имеет fullmatch метод, который сопоставляет регулярное выражение со всей строкой в каждой строке Series, аналогично re.fullmatch (GH 32806).

  • DataFrame.sample() теперь также разрешает передачу массивоподобных объектов и объектов BitGenerator в random_state в качестве начальных значений (GH 32503)

  • Index.union() теперь будет вызывать RuntimeWarning для MultiIndex объектов, если внутренние объекты несортируемы. Передайте sort=False чтобы подавить это предупреждение (GH 33015)

  • Добавлен Series.dt.isocalendar() и DatetimeIndex.isocalendar() который возвращает DataFrame с годом, неделей и днем, рассчитанными в соответствии с календарем ISO 8601 (GH 33206, GH 34392).

  • The DataFrame.to_feather() метод теперь поддерживает дополнительные ключевые слова аргументы (например, для установки сжатия), которые добавлены в pyarrow 0.17 (GH 33422).

  • The cut() теперь будет принимать параметр ordered со значением по умолчанию ordered=True. Если ordered=False и если метки не предоставлены, будет вызвана ошибка (GH 33141)

  • DataFrame.to_csv(), DataFrame.to_pickle(), и DataFrame.to_json() теперь поддерживают передачу словаря аргументов сжатия при использовании gzip и bz2 протоколы. Это можно использовать для установки пользовательского уровня сжатия, например, df.to_csv(path, compression={'method': 'gzip', 'compresslevel': 1} (GH 33196)

  • melt() приобрёл ignore_index (по умолчанию True) аргумент, который, если установлен в False, предотвращает удаление индекса методом (GH 17440).

  • Series.update() теперь принимает объекты, которые могут быть приведены к Series, такие как dict и list, отражая поведение DataFrame.update() (GH 33215)

  • DataFrameGroupBy.transform() и DataFrameGroupBy.aggregate() получили engine и engine_kwargs аргументы, поддерживающие выполнение функций с Numba (GH 32854, GH 33388)

  • Resampler.interpolate() теперь поддерживает метод интерполяции SciPy scipy.interpolate.CubicSpline в качестве метода cubicspline (GH 33670)

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

  • DataFrame.to_numpy() теперь поддерживает na_value ключевое слово для управления NA-сигналом в выходном массиве (GH 33820)

  • Добавлен api.extension.ExtensionArray.equals к интерфейсу расширенного массива, аналогично Series.equals() (GH 27081)

  • Минимальная поддерживаемая версия dta увеличена до 105 в read_stata() и StataReader (GH 26667).

  • to_stata() поддерживает сжатие с использованием compression аргумент ключевого слова. Сжатие может быть выведено или явно задано с помощью строки или словаря, содержащего как метод, так и любые дополнительные аргументы, которые передаются в библиотеку сжатия. Сжатие также было добавлено в низкоуровневые писатели файлов Stata StataWriter, StataWriter117, и StataWriterUTF8 (GH 26599).

  • HDFStore.put() теперь принимает track_times параметр. Этот параметр передаётся в create_table метод PyTables (GH 32682).

  • Series.plot() и DataFrame.plot() теперь принимает xlabel и ylabel параметры для отображения меток на оси x и y (GH 9093).

  • Сделано Rolling и Expanding iterable(GH 11704)

  • Сделано option_context a contextlib.ContextDecorator, что позволяет использовать его как декоратор для всей функции (GH 34253).

  • DataFrame.to_csv() и Series.to_csv() теперь принимает errors аргумент (GH 22610)

  • DataFrameGroupBy.groupby.transform() теперь позволяет func будет pad, backfill и cumcount (GH 31269).

  • read_json() теперь принимает nrows параметр. (Категориальные данные преобразуются в).

  • DataFrame.hist(), Series.hist(), core.groupby.DataFrameGroupBy.hist(), и core.groupby.SeriesGroupBy.hist() получили legend аргумент. Установите True для отображения легенды в гистограмме. (GH 6279)

  • concat() и append() теперь сохраняют типы данных расширений, например, объединение столбца с обнуляемым целым числом и столбца с целым числом numpy больше не приведет к типу object, а сохранит целочисленный тип данных (GH 33607, GH 34339, GH 34095).

  • read_gbq() теперь позволяет отключить индикатор выполнения (GH 33360).

  • read_gbq() теперь поддерживает max_results kwarg из pandas-gbq (GH 34639).

  • DataFrame.cov() и Series.cov() теперь поддерживает новый параметр ddof для поддержки степеней свободы дельты, как в соответствующих методах numpy (GH 34611).

  • DataFrame.to_html() и DataFrame.to_string()’s col_space параметр теперь принимает список или словарь для изменения ширины только некоторых конкретных столбцов (GH 28917).

  • DataFrame.to_excel() теперь также можно записывать файлы электронных таблиц OpenOffice (.ods) (GH 27222)

  • explode() теперь принимает ignore_index для сброса индекса, аналогично pd.concat() или DataFrame.sort_values() (GH 34932).

  • DataFrame.to_markdown() и Series.to_markdown() теперь принимают index аргумент как псевдоним для tabulate showindex (GH 32667)

  • read_csv() теперь принимает строковые значения, такие как "0", "0.0", "1", "1.0", как конвертируемые в обнуляемый булевый тип данных (GH 34859)

  • ExponentialMovingWindow теперь поддерживает times аргумент, который позволяет mean для вычисления с наблюдениями, разделенными временными метками в times (GH 34839)

  • DataFrame.agg() и Series.agg() теперь принимают именованную агрегацию для переименования выходных столбцов/индексов. (GH 26513)

  • compute.use_numba теперь существует как опция конфигурации, которая использует движок numba, когда он доступен (GH 33966, GH 35374)

  • Series.plot() теперь поддерживает асимметричные полосы ошибок. Ранее, если Series.plot() получен массив "2xN" со значениями ошибок для yerr и/или xerr, левые/нижние значения (первая строка) отражались, а правые/верхние значения (вторая строка) игнорировались. Теперь первая строка представляет левые/нижние значения ошибок, а вторая строка — правые/верхние значения ошибок. (GH 9536)

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

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

MultiIndex.get_indexer интерпретирует method аргумент правильно#

Это восстанавливает поведение MultiIndex.get_indexer() с method='backfill' или method='pad' к поведению до pandas 0.23.0. В частности, MultiIndexes рассматриваются как список кортежей, а заполнение или обратное заполнение выполняется относительно порядка этих списков кортежей (GH 29896).

В качестве примера, учитывая:

In [47]: df = pd.DataFrame({
   ....:     'a': [0, 0, 0, 0],
   ....:     'b': [0, 2, 3, 4],
   ....:     'c': ['A', 'B', 'C', 'D'],
   ....: }).set_index(['a', 'b'])
   ....: 

In [48]: mi_2 = pd.MultiIndex.from_product([[0], [-1, 0, 1, 3, 4, 5]])

Различия в переиндексации df с mi_2 и использование method='backfill' можно увидеть здесь:

pandas >= 0.23, < 1.1.0:

In [1]: df.reindex(mi_2, method='backfill')
Out[1]:
      c
0 -1  A
   0  A
   1  D
   3  A
   4  A
   5  C

pandas <0.23, >= 1.1.0

In [49]: df.reindex(mi_2, method='backfill')
Out[49]: 
        c
0 -1    A
   0    A
   1    B
   3    C
   4    D
   5  NaN

[6 rows x 1 columns]

И различия в переиндексации df с mi_2 и использование method='pad' можно увидеть здесь:

pandas >= 0.23, < 1.1.0

In [1]: df.reindex(mi_2, method='pad')
Out[1]:
        c
0 -1  NaN
   0  NaN
   1    D
   3  NaN
   4    A
   5    C

pandas < 0.23, >= 1.1.0

In [50]: df.reindex(mi_2, method='pad')
Out[50]: 
        c
0 -1  NaN
   0    A
   1    A
   3    C
   4    D
   5    D

[6 rows x 1 columns]

Неудачные поиски по меткам всегда вызывают KeyError#

Поиск по меткам series[key], series.loc[key] и frame.loc[key] раньше вызывал либо KeyError или TypeError в зависимости от типа ключа и типа Index. Теперь они последовательно вызывают KeyError (GH 31867)

In [51]: ser1 = pd.Series(range(3), index=[0, 1, 2])

In [52]: ser2 = pd.Series(range(3), index=pd.date_range("2020-02-01", periods=3))

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

In [3]: ser1[1.5]
...
TypeError: cannot do label indexing on Int64Index with these indexers [1.5] of type float

In [4] ser1["foo"]
...
KeyError: 'foo'

In [5]: ser1.loc[1.5]
...
TypeError: cannot do label indexing on Int64Index with these indexers [1.5] of type float

In [6]: ser1.loc["foo"]
...
KeyError: 'foo'

In [7]: ser2.loc[1]
...
TypeError: cannot do label indexing on DatetimeIndex with these indexers [1] of type int

In [8]: ser2.loc[pd.Timestamp(0)]
...
KeyError: Timestamp('1970-01-01 00:00:00')

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

In [3]: ser1[1.5]
...
KeyError: 1.5

In [4] ser1["foo"]
...
KeyError: 'foo'

In [5]: ser1.loc[1.5]
...
KeyError: 1.5

In [6]: ser1.loc["foo"]
...
KeyError: 'foo'

In [7]: ser2.loc[1]
...
KeyError: 1

In [8]: ser2.loc[pd.Timestamp(0)]
...
KeyError: Timestamp('1970-01-01 00:00:00')

Аналогично, DataFrame.at() и Series.at() вызовет TypeError вместо ValueError если передается несовместимый ключ, и KeyError если передан отсутствующий ключ, соответствуя поведению .loc[] (GH 31722)

Неудачные целочисленные поиски по MultiIndex вызывают KeyError#

Индексирование целыми числами с MultiIndex который имеет целочисленный тип данных на первом уровне, некорректно не вызывал KeyError когда один или несколько из этих целочисленных ключей отсутствуют на первом уровне индекса (GH 33539)

In [53]: idx = pd.Index(range(4))

In [54]: dti = pd.date_range("2000-01-03", periods=3)

In [55]: mi = pd.MultiIndex.from_product([idx, dti])

In [56]: ser = pd.Series(range(len(mi)), index=mi)

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

In [5]: ser[[5]]
Out[5]: Series([], dtype: int64)

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

In [5]: ser[[5]]
...
KeyError: '[5] not in index'

DataFrame.merge() сохраняет порядок строк правого фрейма#

DataFrame.merge() теперь сохраняет порядок строк правого фрейма при выполнении правого слияния (GH 27453)

In [57]: left_df = pd.DataFrame({'animal': ['dog', 'pig'],
   ....:                        'max_speed': [40, 11]})
   ....: 

In [58]: right_df = pd.DataFrame({'animal': ['quetzal', 'pig'],
   ....:                         'max_speed': [80, 11]})
   ....: 

In [59]: left_df
Out[59]: 
  animal  max_speed
0    dog         40
1    pig         11

[2 rows x 2 columns]

In [60]: right_df
Out[60]: 
    animal  max_speed
0  quetzal         80
1      pig         11

[2 rows x 2 columns]

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

>>> left_df.merge(right_df, on=['animal', 'max_speed'], how="right")
    animal  max_speed
0      pig         11
1  quetzal         80

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

In [61]: left_df.merge(right_df, on=['animal', 'max_speed'], how="right")
Out[61]: 
    animal  max_speed
0  quetzal         80
1      pig         11

[2 rows x 2 columns]

Присвоение нескольким столбцам DataFrame, когда некоторые столбцы не существуют#

Присваивание нескольким столбцам DataFrame когда некоторые из столбцов не существуют, ранее присваивал значения последнему столбцу. Теперь новые столбцы будут созданы с правильными значениями. (GH 13658)

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

In [63]: df
Out[63]: 
   a  b
0  0  3
1  1  4
2  2  5

[3 rows x 2 columns]

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

In [3]: df[['a', 'c']] = 1
In [4]: df
Out[4]:
   a  b
0  1  1
1  1  1
2  1  1

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

In [64]: df[['a', 'c']] = 1

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

[3 rows x 3 columns]

Согласованность при редукциях groupby#

Используя DataFrame.groupby() с as_index=True и агрегация nunique включал бы столбец(ы) группировки в столбцы результата. Теперь столбец(ы) группировки появляются только в индексе, что согласуется с другими редукциями. (GH 32579)

In [66]: df = pd.DataFrame({"a": ["x", "x", "y", "y"], "b": [1, 1, 2, 3]})

In [67]: df
Out[67]: 
   a  b
0  x  1
1  x  1
2  y  2
3  y  3

[4 rows x 2 columns]

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

In [3]: df.groupby("a", as_index=True).nunique()
Out[4]:
   a  b
a
x  1  1
y  1  2

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

In [68]: df.groupby("a", as_index=True).nunique()
Out[68]: 
   b
a   
x  1
y  2

[2 rows x 1 columns]

Используя DataFrame.groupby() с as_index=False и функция idxmax, idxmin, mad, nunique, sem, skew, или std изменял бы столбец группировки. Теперь столбец группировки остаётся неизменным, что согласуется с другими редукциями. (GH 21090, GH 10355)

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

In [3]: df.groupby("a", as_index=False).nunique()
Out[4]:
   a  b
0  1  1
1  1  2

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

In [69]: df.groupby("a", as_index=False).nunique()
Out[69]: 
   a  b
0  x  1
1  y  2

[2 rows x 2 columns]

Метод DataFrameGroupBy.size() ранее игнорировал as_index=False. Теперь группирующие столбцы возвращаются как столбцы, делая результат DataFrame вместо Series. (GH 32599)

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

In [3]: df.groupby("a", as_index=False).size()
Out[4]:
a
x    2
y    2
dtype: int64

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

In [70]: df.groupby("a", as_index=False).size()
Out[70]: 
   a  size
0  x     2
1  y     2

[2 rows x 2 columns]

DataFrameGroupby.agg() потерянные результаты с as_index=False при переименовании столбцов#

Ранее DataFrameGroupby.agg() потерял результирующие столбцы, когда as_index параметр был установлен в False и результирующие столбцы были переименованы. В этом случае результирующие значения были заменены предыдущим индексом (GH 32240).

In [71]: df = pd.DataFrame({"key": ["x", "y", "z", "x", "y", "z"],
   ....:                    "val": [1.0, 0.8, 2.0, 3.0, 3.6, 0.75]})
   ....: 

In [72]: df
Out[72]: 
  key   val
0   x  1.00
1   y  0.80
2   z  2.00
3   x  3.00
4   y  3.60
5   z  0.75

[6 rows x 2 columns]

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

In [2]: grouped = df.groupby("key", as_index=False)
In [3]: result = grouped.agg(min_val=pd.NamedAgg(column="val", aggfunc="min"))
In [4]: result
Out[4]:
     min_val
 0   x
 1   y
 2   z

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

In [73]: grouped = df.groupby("key", as_index=False)

In [74]: result = grouped.agg(min_val=pd.NamedAgg(column="val", aggfunc="min"))

In [75]: result
Out[75]: 
  key  min_val
0   x     1.00
1   y     0.80
2   z     0.75

[3 rows x 2 columns]

apply и applymap на DataFrame оценивает первую строку/столбец только один раз#

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

In [77]: def func(row):
   ....:     print(row)
   ....:     return row
   ....: 

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

In [4]: df.apply(func, axis=1)
a    1
b    3
Name: 0, dtype: int64
a    1
b    3
Name: 0, dtype: int64
a    2
b    6
Name: 1, dtype: int64
Out[4]:
   a  b
0  1  3
1  2  6

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

In [78]: df.apply(func, axis=1)
a    1
b    3
Name: 0, Length: 2, dtype: int64
a    2
b    6
Name: 1, Length: 2, dtype: int64
Out[78]: 
   a  b
0  1  3
1  2  6

[2 rows x 2 columns]

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

Добавлен check_freq аргумент для testing.assert_frame_equal и testing.assert_series_equal#

The check_freq аргумент был добавлен в testing.assert_frame_equal() и testing.assert_series_equal() в pandas 1.1.0 и по умолчанию равно True. testing.assert_frame_equal() и testing.assert_series_equal() теперь вызывают AssertionError если индексы не имеют одинаковой частоты. До pandas 1.1.0 частота индекса не проверялась.

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

Некоторые минимальные поддерживаемые версии зависимостей были обновлены (GH 33718, GH 29766, GH 29723, pytables >= 3.4.3). Если установлено, теперь требуется:

Пакет

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

Обязательно

Изменено

numpy

1.15.4

X

X

pytz

2015.4

X

python-dateutil

2.7.3

X

X

bottleneck

1.2.1

numexpr

2.6.2

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

4.0.2

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

Пакет

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

Изменено

beautifulsoup4

4.6.0

fastparquet

0.3.2

fsspec

0.7.4

gcsfs

0.6.0

X

lxml

3.8.0

matplotlib

2.2.2

numba

0.46.0

openpyxl

2.5.7

pyarrow

0.13.0

pymysql

0.7.1

pytables

3.4.3

X

s3fs

0.4.0

X

scipy

1.2.0

X

sqlalchemy

1.1.4

xarray

0.8.2

xlrd

1.1.0

xlsxwriter

0.9.8

xlwt

1.2.0

pandas-gbq

1.2.0

X

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

Изменения в разработке#

  • Минимальная версия Cython теперь является последней версией с исправлением ошибок (0.29.16) (GH 33334).

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

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

  • DataFrame.mean() и DataFrame.median() с numeric_only=None будет включать datetime64 и datetime64tz именованный аргумент, который работает сGH 29941)

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

  • DataFrame.to_dict() устарело принятие коротких имен для orient и будет вызывать ошибку в будущей версии (GH 32515)

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

  • The fastpath ключевое слово в SingleBlockManager конструктор устарел и будет удален в будущей версии (GH 33092)

  • Предоставление suffixes в качестве set в pandas.merge() устарел. Вместо этого укажите кортеж (GH 33740, GH 34741).

  • Индексирование Series с многомерным индексатором, таким как [:, None] для возврата ndarray теперь вызывает FutureWarning. Преобразовать в массив NumPy перед индексированием вместо этого (GH 27837)

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

  • Передача любых аргументов, кроме первого, в read_html() как позиционные аргументы устарели. Все остальные аргументы должны передаваться как ключевые аргументы (GH 27573).

  • Передача любых аргументов, кроме path_or_buf (первый) в read_json() использование в качестве позиционных аргументов устарело. Все остальные аргументы должны передаваться как ключевые слова (GH 27573).

  • Передача любых аргументов, кроме первых двух, в read_excel() как позиционные аргументы устарели. Все остальные аргументы должны передаваться как ключевые аргументы (GH 27573).

  • pandas.api.types.is_categorical() устарел и будет удалён в будущей версии; используйте pandas.api.types.is_categorical_dtype() вместо (GH 33385)

  • Index.get_value() устарел и будет удален в будущей версии (GH 19728)

  • Series.dt.week() и Series.dt.weekofyear() устарели и будут удалены в будущей версии, используйте Series.dt.isocalendar().week() вместо (GH 33595)

  • DatetimeIndex.week() и DatetimeIndex.weekofyear устарели и будут удалены в будущей версии, используйте DatetimeIndex.isocalendar().week вместо (GH 33595)

  • DatetimeArray.week() и DatetimeArray.weekofyear устарели и будут удалены в будущей версии, используйте DatetimeArray.isocalendar().week вместо (GH 33595)

  • DateOffset.__call__() устарел и будет удален в будущей версии, используйте offset + other вместо (GH 34171)

  • apply_index() устарел и будет удален в будущей версии. Используйте offset + other вместо (GH 34580)

  • DataFrame.tshift() и Series.tshift() устарели и будут удалены в будущей версии, используйте DataFrame.shift() и Series.shift() вместо (GH 11631)

  • Индексирование Index объект с ключом типа float устарел и будет вызывать IndexError в будущем. Вы можете вручную преобразовать в целочисленный ключ вместо (GH 34191).

  • The squeeze ключевое слово в groupby() устарел и будет удален в будущей версии (GH 32380)

  • The tz ключевое слово в Period.to_timestamp() устарел и будет удалён в будущей версии; используйте per.to_timestamp(...).tz_localize(tz) вместо (GH 34522)

  • DatetimeIndex.to_perioddelta() устарел и будет удален в будущей версии. Используйте index - index.to_period(freq).to_timestamp() вместо (GH 34853)

  • DataFrame.melt() принимающий value_name который уже существует, устарел и будет удален в будущей версии (GH 34731)

  • The center ключевое слово в DataFrame.expanding() функция устарела и будет удалена в будущей версии (GH 20647)

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

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

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

  • Улучшение производительности в гибких арифметических операциях между DataFrame и Series с axis=0 (GH 31296)

  • Улучшение производительности в арифметических операциях между DataFrame и Series с axis=1 (GH 33600)

  • Внутренний метод индекса _shallow_copy() теперь копирует кэшированные атрибуты в новый индекс, избегая их повторного создания в новом индексе. Это может ускорить многие операции, зависящие от создания копий существующих индексов (GH 28584, GH 32640, GH 32669)

  • Значительное улучшение производительности при создании DataFrame с разреженными значениями из scipy.sparse матрицы с использованием DataFrame.sparse.from_spmatrix() конструктор (GH 32821, GH 32825, GH 32826, GH 32856, GH 32858).

  • Улучшение производительности для методов groupby Groupby.first() и Groupby.last() (GH 34178)

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

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

  • Исправлена регрессия производительности в pandas.qcut() и pandas.cut() (GH 33921)

  • Улучшение производительности в редукциях (sum, prod, min, max) для обнуляемых (целочисленных и логических) типов данных (GH 30982, GH 33261, GH 33442).

  • Улучшение производительности в арифметических операциях между двумя DataFrame объекты (GH 32779)

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

  • Улучшение производительности в арифметических операциях (sub, add, mul, div) для MultiIndex (GH 34297)

  • Улучшение производительности в DataFrame[bool_indexer] когда bool_indexer является list (GH 33924)

  • Значительное улучшение производительности io.formats.style.Styler.render() со стилями, добавленными различными способами, такими как io.formats.style.Styler.apply(), io.formats.style.Styler.applymap() или io.formats.style.Styler.bar() (GH 19917)

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

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

  • Передача недопустимого fill_value to Categorical.take() вызывает ValueError вместо TypeError (GH 33660)

  • Объединение Categorical с целочисленными категориями и содержащий пропущенные значения со столбцом типа float в операциях, таких как concat() или append() теперь будет приводить к столбцу с типом float вместо столбца с типом object (GH 33607)

  • Ошибка, где merge() не удалось выполнить соединение по не уникальным категориальным индексам (GH 28189)

  • Ошибка при передаче категориальных данных в Index конструктор вместе с dtype=object некорректно возвращает CategoricalIndex вместо object-dtype Index (GH 32167)

  • Ошибка, где Categorical оператор сравнения __ne__ некорректно вычислялось как False когда любой элемент отсутствовал (GH 32276)

  • Categorical.fillna() теперь принимает Categorical other аргумент (GH 32420)

  • Repr из Categorical не различал между int и str (GH 33676)

Datetimelike#

  • Передача целочисленного типа данных, отличного от int64 to np.array(period_index, dtype=...) теперь будет вызывать TypeError вместо некорректного использования int64 (GH 32255)

  • Series.to_timestamp() теперь вызывает TypeError если ось не является PeriodIndex. Ранее AttributeError был поднят (GH 33327)

  • Series.to_period() теперь вызывает TypeError если ось не является DatetimeIndex. Ранее AttributeError был поднят (GH 33327)

  • Period больше не принимает кортежи для freq аргумент (GH 34658)

  • Ошибка в Timestamp где построение Timestamp из неоднозначного времени эпохи и повторный вызов конструктора изменил Timestamp.value() свойство (GH 24329)

  • DatetimeArray.searchsorted(), TimedeltaArray.searchsorted(), PeriodArray.searchsorted() не распознавая не-pandas скаляры и ошибочно вызывая ValueError вместо TypeError (GH 30950)

  • Ошибка в Timestamp где конструирование Timestamp с dateutil timezone менее 128 наносекунд до перехода на летнее время с зимнего на летнее время приводило к несуществующему времени (GH 31043)

  • Ошибка в Period.to_timestamp(), Period.start_time() с микросекундной частотой, возвращающей метку времени на одну наносекунду раньше правильного времени (GH 31475)

  • Timestamp выдавало запутанное сообщение об ошибке, когда год, месяц или день отсутствует (GH 31200)

  • Ошибка в DatetimeIndex конструктор некорректно принимающий bool-dtype входные данные (GH 32668)

  • Ошибка в DatetimeIndex.searchsorted() не принимает list или Series в качестве аргумента (GH 32762)

  • Ошибка, где PeriodIndex() возникает при передаче Series строк (GH 26109)

  • Ошибка в Timestamp арифметические операции при добавлении или вычитании np.ndarray с timedelta64 тип данных (GH 33296)

  • Ошибка в DatetimeIndex.to_period() не определяет частоту при вызове без аргументов (GH 33358)

  • Ошибка в DatetimeIndex.tz_localize() некорректно сохранял freq в некоторых случаях, где оригинальный freq больше не действителен (GH 30511)

  • Ошибка в DatetimeIndex.intersection() теряя freq и часовой пояс в некоторых случаях (GH 33604)

  • Ошибка в DatetimeIndex.get_indexer() где возвращался некорректный вывод для смешанных целей, подобных дате-времени (GH 33741)

  • Ошибка в DatetimeIndex сложение и вычитание с некоторыми типами DateOffset объекты некорректно сохраняют недопустимый freq атрибут (GH 33779)

  • Ошибка в DatetimeIndex где установка freq атрибут индекса мог тихо изменить freq атрибут на другом индексе, просматривающем те же данные (GH 33552)

  • DataFrame.min() и DataFrame.max() не возвращали согласованные результаты с Series.min() и Series.max() при вызове на объектах, инициализированных пустыми pd.to_datetime()

  • Ошибка в DatetimeIndex.intersection() и TimedeltaIndex.intersection() с результатами, не имеющими правильного name атрибут (GH 33904)

  • Ошибка в DatetimeArray.__setitem__(), TimedeltaArray.__setitem__(), PeriodArray.__setitem__() неправильно разрешая значения с int64 тип данных для неявного приведения (GH 33717)

  • Ошибка при вычитании TimedeltaIndex из Period некорректное возбуждение TypeError в некоторых случаях, когда должно было завершиться успешно, и IncompatibleFrequency в некоторых случаях, когда должна вызываться ошибка TypeError (GH 33883)

  • Ошибка при построении Series или Index из массива NumPy только для чтения с разрешением не в наносекундах, который преобразуется в тип object вместо приведения к datetime64[ns] тип данных при нахождении в пределах границ временной метки (GH 34843).

  • The freq ключевое слово в Period, date_range(), period_range(), pd.tseries.frequencies.to_offset() больше не допускает кортежи, передавайте как строку (GH 34703)

  • Ошибка в DataFrame.append() при добавлении Series содержащий скаляр с информацией о часовом поясе Timestamp в пустой DataFrame привело к столбцу с объектами вместо datetime64[ns, tz] тип данных (GH 35038)

  • OutOfBoundsDatetime выдает улучшенное сообщение об ошибке, когда метка времени выходит за пределы реализации. (GH 32967)

  • Ошибка в AbstractHolidayCalendar.holidays() когда правила не были определены (GH 31415)

  • Ошибка в Tick сравнения, вызывающие TypeError при сравнении с объектами, подобными timedelta (GH 34088)

  • Ошибка в Tick умножение вызывает TypeError при умножении на число с плавающей точкой (GH 34486)

Timedelta#

  • Ошибка при построении Timedelta с целым числом высокой точности, которое округлило бы Timedelta компоненты (GH 31354)

  • Ошибка при делении np.nan или None by Timedelta некорректно возвращает NaT (GH 31869)

  • Timedelta теперь понимает µs как идентификатор для микросекунды (GH 32899)

  • Timedelta строковое представление теперь включает наносекунды, когда наносекунды ненулевые (GH 9309)

  • Ошибка при сравнении Timedelta объект против np.ndarray с timedelta64 тип данных некорректно рассматривает все записи как неравные (GH 33441)

  • Ошибка в timedelta_range() что создавало лишнюю точку в крайнем случае (GH 30353, GH 33498)

  • Ошибка в DataFrame.resample() что создавало лишнюю точку в крайнем случае (GH 30353, GH 13022, GH 33498)

  • Ошибка в DataFrame.resample() который игнорировал loffset аргумент при работе с timedelta (GH 7687, GH 33498)

  • Ошибка в Timedelta и pandas.to_timedelta() который игнорировал unit аргумент для строкового ввода (GH 12136)

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

  • Ошибка в to_datetime() с infer_datetime_format=True где названия часовых поясов (например, UTC) не будет правильно разобран (GH 33133)

Числовой#

  • Ошибка в DataFrame.floordiv() с axis=0 не обрабатывал деление на ноль как Series.floordiv() (GH 31271)

  • Ошибка в to_numeric() со строковым аргументом "uint64" и errors="coerce" молчаливо завершается с ошибкой (GH 32394)

  • Ошибка в to_numeric() с downcast="unsigned" не работает для пустых данных (GH 32493)

  • Ошибка в DataFrame.mean() с numeric_only=False и либо datetime64 тип данных или PeriodDtype столбец некорректно вызывает TypeError (GH 32426)

  • Ошибка в DataFrame.count() с level="foo" и уровень индекса "foo" содержащие NaN вызывают ошибку сегментации (GH 21824)

  • Ошибка в DataFrame.diff() с axis=1 возвращая некорректные результаты со смешанными типами данных (GH 32995)

  • Ошибка в DataFrame.corr() и DataFrame.cov() вызывая исключение при обработке nullable integer столбцов с pandas.NA (GH 33803)

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

  • Ошибка в DataFrame и Series сложение и вычитание между объектами типа object и datetime64 объекты dtype (GH 33824)

  • Ошибка в Index.difference() давая некорректные результаты при сравнении Float64Index и объект Index (GH 35217)

  • Ошибка в DataFrame агрегации (например, df.min(), df.max()) с ExtensionArray типы данных (GH 34520, GH 32651)

  • Series.interpolate() и DataFrame.interpolate() теперь вызывает ValueError, если limit_direction является 'forward' или 'both' и method является 'backfill' или 'bfill' или limit_direction является 'backward' или 'both' и method является 'pad' или 'ffill' (GH 34746)

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

  • Ошибка в Series создание из массива NumPy с порядком байтов big-endian datetime64 тип данных (GH 29684)

  • Ошибка в Timedelta создание с большим значением ключевого слова nanoseconds (GH 32402)

  • Ошибка в DataFrame конструкция, где множества дублировались, а не вызывали ошибку (GH 32582)

  • The DataFrame конструктор больше не принимает список DataFrame объекты. Из-за изменений в NumPy, DataFrame объекты теперь последовательно обрабатываются как 2D-объекты, поэтому список DataFrame объекты считаются 3D и больше не допустимы для DataFrame конструктор (GH 32289).

  • Ошибка в DataFrame при инициализации фрейма со списками и присваивании columns с вложенным списком для MultiIndex (GH 32173)

  • Улучшено сообщение об ошибке для недопустимого создания списка при создании нового индекса (GH 35190)

Строки#

  • Ошибка в astype() метод при преобразовании данных типа "string" в тип nullable integer (GH 32450).

  • Исправлена проблема, когда взятие min или max из StringArray или Series с StringDtype тип вызывал ошибку. (GH 31746)

  • Ошибка в Series.str.cat() возвращая NaN вывод, когда other имел Index тип (GH 33425)

  • pandas.api.dtypes.is_string_dtype() больше не ошибочно идентифицирует категориальные серии как строковые.

Interval#

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

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

  • DataFrame.xs() теперь вызывает TypeError если level ключевое слово указано, и ось не является MultiIndex. Ранее AttributeError был поднят (GH 33610)

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

  • Ошибка в PeriodIndex.get_loc() обрабатывая строки с более высоким разрешением иначе, чем PeriodIndex.get_value() (GH 31172)

  • Ошибка в Series.at() и DataFrame.at() не совпадающий .loc поведение при поиске целого числа в Float64Index (GH 31329)

  • Ошибка в PeriodIndex.is_monotonic() некорректно возвращает True при наличии ведущих NaT записи (GH 31437)

  • Ошибка в DatetimeIndex.get_loc() вызов KeyError с преобразованным целочисленным ключом вместо переданного пользователем ключа (GH 31425)

  • Ошибка в Series.xs() некорректно возвращает Timestamp вместо datetime64 в некоторых случаях с object-dtype (GH 31630)

  • Ошибка в DataFrame.iat() некорректно возвращает Timestamp вместо datetime в некоторых случаях с object-dtype (GH 32809)

  • Ошибка в DataFrame.at() когда либо столбцы, либо индекс не уникальны (GH 33041)

  • Ошибка в Series.loc() и DataFrame.loc() при индексировании целочисленным ключом на object-dtype Index который не является полностью целочисленным (GH 31905)

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

  • Ошибка в DataFrame.loc() и Series.loc() с DatetimeIndex, TimedeltaIndex, или PeriodIndex неправильно разрешая поиск несовпадающих datetime-подобных типов данных (GH 32650)

  • Ошибка в Series.__getitem__() индексирование с нестандартными скалярами, например np.dtype (GH 32684)

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

  • Ошибка в DataFrame.lookup() некорректно вызывал AttributeError когда frame.index или frame.columns не является уникальным; теперь это вызовет ValueError с полезным сообщением об ошибке (GH 33041)

  • Ошибка в Interval где Timedelta нельзя было добавить или вычесть из Timestamp интервал (GH 32023)

  • Ошибка в DataFrame.copy() не аннулирование _item_cache после копирования приводило к тому, что обновления значений после копирования не отражались (GH 31784)

  • Исправлена регрессия в DataFrame.loc() и Series.loc() выбрасывание ошибки, когда datetime64[ns, tz] значение предоставлено (GH 32395)

  • Ошибка в Series.__getitem__() с целочисленным ключом и MultiIndex с ведущим целочисленным уровнем, не вызывающим ошибку KeyError если ключ отсутствует на первом уровне (GH 33355)

  • Ошибка в DataFrame.iloc() при срезе одного столбца DataFrame с ExtensionDtype (например, df.iloc[:, :1]) возвращает недопустимый результат (GH 32957)

  • Ошибка в DatetimeIndex.insert() и TimedeltaIndex.insert() вызывая индекс freq будет потерян при установке элемента в пустой Series (GH 33573)

  • Ошибка в Series.__setitem__() с IntervalIndex и список-подобный ключ целых чисел (GH 33473)

  • Ошибка в Series.__getitem__() разрешение пропущенных меток с np.ndarray, Index, Series индексаторы, но не list, теперь все они вызывают KeyError (GH 33646)

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

  • Индексирование списком строк, представляющих даты и время, не работало на DatetimeIndex или PeriodIndex (GH 11278)

  • Ошибка в Series.at() при использовании с MultiIndex вызывал исключение на корректных входных данных (GH 26989)

  • Ошибка в DataFrame.loc() со словарем значений изменяет колонки с типом данных int to float (GH 34573)

  • Ошибка в Series.loc() при использовании с MultiIndex вызовет IndexingError при доступе к None значение (GH 34318)

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

  • Ошибка в Series и DataFrame индексирование с помощью time ключ на DatetimeIndex с NaT записи (GH 35114)

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

  • Вызов fillna() на пустом Series теперь корректно возвращает поверхностно скопированный объект. Поведение теперь согласовано с Index, DataFrame и непустой Series (GH 32543).

  • Ошибка в Series.replace() когда аргумент to_replace имеет тип dict/list и используется на Series содержащий вызывал TypeError. Метод теперь обрабатывает это, игнорируя значения при сравнении для замены (GH 32621)

  • Ошибка в any() и all() некорректно возвращает для всех False или все True значения с использованием nullable булева типа данных и с skipna=False (GH 33253)

  • Уточнена документация по interpolate с method=akima. der параметр должен быть скаляром или None (GH 33426)

  • DataFrame.interpolate() использует правильную конвенцию осей теперь. Ранее интерполяция вдоль столбцов приводила к интерполяции вдоль индексов и наоборот. Кроме того, интерполяция с методами pad, ffill, bfill и backfill идентичны использованию этих методов с DataFrame.fillna() (GH 12918, GH 29146)

  • Ошибка в DataFrame.interpolate() при вызове на DataFrame со именами столбцов строкового типа вызывало ValueError. Метод теперь не зависит от типа имен столбцов (GH 33956)

  • Передача NA в строку формата с использованием спецификаций формата теперь будет работать. Например "{:.1f}".format(pd.NA) ранее вызывал ValueError, но теперь будет возвращать строку "" (GH 34740)

  • Ошибка в Series.map() не вызывает ошибку при недопустимом na_action (GH 32815)

MultiIndex#

  • DataFrame.swaplevels() теперь вызывает TypeError если ось не является MultiIndex. Ранее AttributeError был поднят (GH 31126)

  • Ошибка в Dataframe.loc() при использовании с MultiIndex. Возвращенные значения не были в том же порядке, что и заданные входные данные (GH 22797)

In [79]: df = pd.DataFrame(np.arange(4),
   ....:                   index=[["a", "a", "b", "b"], [1, 2, 1, 2]])
   ....: 

# Rows are now ordered as the requested keys
In [80]: df.loc[(['b', 'a'], [2, 1]), :]
Out[80]: 
     0
b 2  3
  1  2
a 2  1
  1  0

[4 rows x 1 columns]
In [81]: left = pd.MultiIndex.from_arrays([["b", "a"], [2, 1]])

In [82]: right = pd.MultiIndex.from_arrays([["a", "b", "c"], [1, 2, 3]])

# Common elements are now guaranteed to be ordered by the left side
In [83]: left.intersection(right, sort=False)
Out[83]: 
MultiIndex([('b', 2),
            ('a', 1)],
           )
  • Ошибка при объединении двух MultiIndex без указания уровня с разными столбцами. Параметр return-indexers игнорировался. (GH 34074)

Ввод-вывод#

  • Передача set как names аргумент для pandas.read_csv(), pandas.read_table(), или pandas.read_fwf() вызовет исключение ValueError: Names should be an ordered collection. (GH 34946)

  • Ошибка в выводе при display.precision равен нулю. (GH 20359)

  • Ошибка в read_json() где происходило переполнение целых чисел, когда json содержит строки с большими числами. (GH 30320)

  • read_csv() теперь вызовет ValueError когда аргументы header и prefix оба не None. (GH 27394)

  • Ошибка в DataFrame.to_json() вызывал NotFoundError когда path_or_buf был URI S3 (GH 28375)

  • Ошибка в DataFrame.to_parquet() перезапись значения по умолчанию pyarrow для coerce_timestamps; следование стандартному поведению pyarrow позволяет записывать наносекундные временные метки с version="2.0" (GH 31652).

  • Ошибка в read_csv() вызывал TypeError когда sep=None использовался в сочетании с comment ключевое слово (GH 31396)

  • Ошибка в HDFStore что привело к установке значения int64 тип данных datetime64 столбец при чтении DataFrame в Python 3 из фиксированного формата, написанного в Python 2 (GH 31750)

  • read_sas() теперь обрабатывает даты и даты-время больше Timestamp.max возвращая их как datetime.datetime объекты (GH 20927)

  • Ошибка в DataFrame.to_json() где Timedelta объекты не будут сериализованы корректно с date_format="iso" (GH 28256)

  • read_csv() вызовет ValueError когда переданные имена столбцов parse_dates отсутствуют в Dataframe (GH 31251)

  • Ошибка в read_excel() где строка UTF-8 с высоким суррогатом вызывала нарушение сегментации (GH 23809)

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

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

  • Ошибка в read_csv() вызывал вводящее в заблуждение исключение при проблеме с разрешениями (GH 23784)

  • Ошибка в read_csv() вызывал IndexError когда header=None и два дополнительных столбца данных

  • Ошибка в read_sas() вызывал AttributeError при чтении файлов из Google Cloud Storage (GH 33069)

  • Ошибка в DataFrame.to_sql() где AttributeError вызывалась при сохранении даты вне допустимого диапазона (GH 26761)

  • Ошибка в read_excel() неправильно обрабатывал несколько встроенных пробелов в ячейках текста OpenDocument. (GH 32207)

  • Ошибка в read_json() вызывал TypeError при чтении list булевых значений в Series. (GH 31464)

  • Ошибка в pandas.io.json.json_normalize() где местоположение указано record_path не указывает на массив. (GH 26284)

  • pandas.read_hdf() имеет более явное сообщение об ошибке при загрузке неподдерживаемого HDF файла (GH 9539)

  • Ошибка в read_feather() вызывал ArrowIOError при чтении пути к файлу s3 или http (GH 29055)

  • Ошибка в to_excel() не удалось обработать имя столбца render и вызывал KeyError (GH 34331)

  • Ошибка в execute() вызывал ProgrammingError для некоторых драйверов DB-API, когда SQL-запрос содержал % символ и параметры отсутствовали (GH 34211)

  • Ошибка в StataReader() что приводило к категориальным переменным с разными типами данных при чтении данных с использованием итератора. (GH 31544)

  • HDFStore.keys() теперь имеет опциональный include параметр, позволяющий извлекать все нативные имена таблиц HDF5 (GH 29916)

  • TypeError исключения, вызванные read_csv() и read_table() отображались как parser_f когда был передан неожиданный ключевой аргумент (GH 25648)

  • Ошибка в read_excel() для файлов ODS удаляет значения 0.0 (GH 27222)

  • Ошибка в ujson.encode() вызывал OverflowError с числами больше sys.maxsize (GH 34395)

  • Ошибка в HDFStore.append_to_multiple() вызывал ValueError когда min_itemsize параметр установлен (GH 11238)

  • Ошибка в create_table() теперь вызывает ошибку, когда column аргумент не был указан в data_columns на входе (GH 28156)

  • read_json() теперь может читать построчно разделённый JSON-файл из URL файла, в то время как lines и chunksize установлены.

  • Ошибка в DataFrame.to_sql() при чтении DataFrames с -np.inf записи с MySQL теперь имеют более явный ValueError (GH 34431)

  • Ошибка, когда файлы с заглавными расширениями не распаковывались функциями read_* (GH 35164)

  • Ошибка в read_excel() который вызывал TypeError когда header=None и index_col задается как list (GH 31783)

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

  • read_excel() больше не принимает **kwds аргументы. Это означает, что передача ключевого аргумента chunksize теперь вызывает TypeError (ранее вызывал NotImplementedError), при передаче ключевого аргумента encoding теперь вызывает TypeError (GH 34464)

  • Ошибка в DataFrame.to_records() некорректно терял информацию о часовом поясе в данных с учетом часового пояса datetime64 столбцы (GH 32535)

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

  • DataFrame.plot() для line/bar теперь принимает цвет через словарь (GH 8193).

  • Ошибка в DataFrame.plot.hist() где веса не работают для нескольких столбцов (GH 33173)

  • Ошибка в DataFrame.boxplot() и DataFrame.plot.boxplot() потеряны цветовые атрибуты medianprops, whiskerprops, capprops и boxprops (GH 30346)

  • Ошибка в DataFrame.hist() где порядок column аргумент игнорировался (GH 29235)

  • Ошибка в DataFrame.plot.scatter() что при добавлении нескольких графиков с разными cmap, цветовые шкалы всегда используют первый cmap (GH 33389)

  • Ошибка в DataFrame.plot.scatter() добавлял цветовую шкалу к графику, даже если аргумент c был присвоен столбцу, содержащему названия цветов (GH 34316)

  • Ошибка в pandas.plotting.bootstrap_plot() вызывал загромождение осей и перекрывающиеся метки (GH 34905)

  • Ошибка в DataFrame.plot.scatter() вызывал ошибку при построении графиков с переменными размерами маркеров (GH 32904)

GroupBy/resample/rolling#

  • Использование pandas.api.indexers.BaseIndexer с count, min, max, median, skew, cov, corr теперь будет возвращать корректные результаты для любой монотонной pandas.api.indexers.BaseIndexer потомок (GH 32865)

  • DataFrameGroupby.mean() и SeriesGroupby.mean() (и аналогично для median(), std() и var()) теперь вызывает TypeError если в него передан недопустимый ключевой аргумент. Ранее UnsupportedFunctionCall был поднят (AssertionError if min_count передано в median()) (GH 31485)

  • Ошибка в DataFrameGroupBy.apply() и SeriesGroupBy.apply() вызов ValueError когда by ось не отсортирована, имеет дубликаты, и примененная func не изменяет переданные объекты (GH 30667)

  • Ошибка в DataFrameGroupBy.transform() выдаёт некорректный результат с функциями преобразования (GH 30918)

  • Ошибка в DataFrameGroupBy.transform() и SeriesGroupBy.transform() возвращали неправильный результат при группировке по нескольким ключам, некоторые из которых были категориальными, а другие нет (GH 32494)

  • Ошибка в DataFrameGroupBy.count() и SeriesGroupBy.count() вызывает ошибку сегментации, когда группируемые столбцы содержат значения NaN (GH 32841)

  • Ошибка в DataFrame.groupby() и Series.groupby() дает несовместимый тип при агрегировании Boolean Series (GH 32894)

  • Ошибка в DataFrameGroupBy.sum() и SeriesGroupBy.sum() где возвращалось бы большое отрицательное число, когда количество ненулевых значений было ниже min_count для nullable integer dtypes (GH 32861)

  • Ошибка в SeriesGroupBy.quantile() вызывал ошибку на nullable integers (GH 33136)

  • Ошибка в DataFrame.resample() где AmbiguousTimeError будет вызвано, когда результирующий часовой пояс с учётом DatetimeIndex имел переход на летнее время в полночь (GH 25758)

  • Ошибка в DataFrame.groupby() где ValueError будет возникать при группировке по категориальному столбцу с категориями только для чтения и sort=False (GH 33410)

  • Ошибка в DataFrameGroupBy.agg(), SeriesGroupBy.agg(), DataFrameGroupBy.transform(), SeriesGroupBy.transform(), DataFrameGroupBy.resample(), и SeriesGroupBy.resample() где подклассы не сохраняются (GH 28330)

  • Ошибка в SeriesGroupBy.agg() где любое имя столбца принималось в именованной агрегации SeriesGroupBy ранее. Теперь поведение позволяет только str и вызываемые объекты, иначе вызовут исключение TypeError. (GH 34422)

  • Ошибка в DataFrame.groupby() потеряно имя Index когда один из agg ключи ссылались на пустой список (GH 32580)

  • Ошибка в Rolling.apply() где center=True игнорировался, когда engine='numba' был указан (GH 34784)

  • Ошибка в DataFrame.ewm.cov() выбрасывал AssertionError для MultiIndex входные данные (GH 34440)

  • Ошибка в core.groupby.DataFrameGroupBy.quantile() вызвано TypeError для нечисловых типов вместо удаления столбцов (GH 27892)

  • Ошибка в core.groupby.DataFrameGroupBy.transform() когда func='nunique' и столбцы имеют тип datetime64, результат также будет типа datetime64 вместо int64 (GH 35109)

  • Ошибка в DataFrame.groupby() вызов AttributeError при выборе столбца и агрегировании с as_index=False (GH 35246).

  • Ошибка в DataFrameGroupBy.first() и DataFrameGroupBy.last() что вызвало бы ненужное ValueError при группировке по нескольким Categoricals (GH 34951)

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

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

  • Ошибка в DataFrame.pivot_table() когда только MultiIndexed столбцы установлены (GH 17038)

  • Ошибка в DataFrame.unstack() и Series.unstack() может принимать имена кортежей в MultiIndexed данные (GH 19966)

  • Ошибка в DataFrame.pivot_table() когда margin является True и только column определена (GH 31016)

  • Исправлено некорректное сообщение об ошибке в DataFrame.pivot() когда columns установлено в None. (GH 30924)

  • Ошибка в crosstab() когда входные данные представляют собой два Series и имеют имена-кортежи, вывод сохранит фиктивный MultiIndex в качестве столбцов. (GH 18321)

  • DataFrame.pivot() теперь может принимать списки для index и columns аргументы (GH 21425)

  • Ошибка в concat() где результирующие индексы не копируются, когда copy=True (GH 29879)

  • Ошибка в SeriesGroupBy.aggregate() приводило к перезаписи агрегаций, когда они имели одинаковое имя (GH 30880)

  • Ошибка, где Index.astype() потеряет name атрибут при преобразовании из Float64Index to Int64Index, или при приведении к ExtensionArray тип данных (GH 32013)

  • Series.append() теперь вызовет TypeError когда передан DataFrame или последовательность, содержащая DataFrame (GH 31413)

  • DataFrame.replace() и Series.replace() вызовет TypeError if to_replace не является ожидаемым типом. Ранее replace завершалось молчаливым сбоем (GH 18634)

  • Ошибка при операции на месте для Series которая добавляла столбец к DataFrame откуда он был изначально удалён (используя inplace=True) (GH 30484)

  • Ошибка в DataFrame.apply() где callback был вызван с Series параметр, хотя raw=True запрошен. (GH 32423)

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

  • Ошибка в concat() где при передаче не-словаря в качестве отображения objs вызовет TypeError (GH 32863)

  • DataFrame.agg() теперь предоставляет более описательные SpecificationError сообщение при попытке агрегировать несуществующий столбец (GH 32755)

  • Ошибка в DataFrame.unstack() когда MultiIndex столбцы и MultiIndex строк использовалось (GH 32624, GH 24729 и GH 28306)

  • Добавление словаря к DataFrame без передачи ignore_index=True вызовет исключение TypeError: Can only append a dict if ignore_index=True вместо TypeError: Can only append a :class:`Series` if ignore_index=True or if the :class:`Series` has a name (GH 30871)

  • Ошибка в DataFrame.corrwith(), DataFrame.memory_usage(), DataFrame.dot(), DataFrame.idxmin(), DataFrame.idxmax(), DataFrame.duplicated(), DataFrame.isin(), DataFrame.count(), Series.explode(), Series.asof() и DataFrame.asof() не возвращает подклассы типов. (GH 31331)

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

  • Ошибка в cut() вызывал ошибку, когда аргумент labels содержит дубликаты (GH 33141)

  • Убедитесь, что только именованные функции могут использоваться в eval() (GH 32460)

  • Ошибка в Dataframe.aggregate() и Series.aggregate() вызывал рекурсивный цикл в некоторых случаях (GH 34224)

  • Исправлена ошибка в melt() где расплавление MultiIndex столбцы с col_level > 0 вызовет KeyError на id_vars (GH 34129)

  • Ошибка в Series.where() с пустым Series и пустой cond имеющий небулевый тип данных (GH 34592)

  • Исправлена регрессия, где DataFrame.apply() вызовет ValueError для элементов с S тип данных (GH 34529)

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

  • Создание SparseArray из timezone-aware dtype будет выдавать предупреждение перед удалением информации о часовом поясе, вместо того чтобы делать это молча (GH 32501)

  • Ошибка в arrays.SparseArray.from_spmatrix() неправильно читал разреженную матрицу scipy (GH 31991)

  • Ошибка в Series.sum() с SparseArray вызывал TypeError (GH 25777)

  • Ошибка, где DataFrame содержащий полностью разреженный SparseArray заполнено NaN при индексировании list-like (GH 27781, GH 29563)

  • Представление (repr) объекта SparseDtype теперь включает repr своего fill_value атрибут. Ранее использовался fill_valueстроковое представление (GH 34352)

  • Ошибка, когда пустой DataFrame не может быть преобразован в SparseDtype (GH 33113)

  • Ошибка в arrays.SparseArray() возвращал неправильный тип при индексации разреженного датафрейма итерируемым объектом (GH 34526, GH 34540)

ExtensionArray#

  • Исправлена ошибка, где Series.value_counts() вызывало бы исключение на пустом вводе Int64 тип данных (GH 33317)

  • Исправлена ошибка в concat() при объединении DataFrame объектов с непересекающимися столбцами, приводя к столбцам типа object-dtype вместо сохранения расширенного типа данных (GH 27692, GH 33027)

  • Исправлена ошибка, где StringArray.isna() вернёт False для значений NA, когда pandas.options.mode.use_inf_as_na был установлен в True (GH 33655)

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

  • Исправлена ошибка, которая вызывала Series.__repr__() к крашу для типов расширений, чьи элементы являются многомерными массивами (GH 33770).

  • Исправлена ошибка, где Series.update() вызовет ValueError для ExtensionArray типы данных с пропущенными значениями (GH 33980)

  • Исправлена ошибка, где StringArray.memory_usage() не был реализован (GH 33963)

  • Исправлена ошибка, где DataFrameGroupBy() будет игнорировать min_count аргумент для агрегаций по допускающим значения NULL логическим типам данных (GH 34051)

  • Исправлена ошибка, при которой конструктор DataFrame с dtype='string' завершится неудачей (GH 27953, GH 33623)

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

  • Исправлена ошибка в IntegerArray.astype() для корректного копирования маски также (GH 34931).

Другие#

  • Операции над множествами для объекта типа Index теперь всегда возвращают результаты типа object (GH 31401)

  • Исправлено pandas.testing.assert_series_equal() чтобы правильно вызывать ошибку, если left аргумент является другим подклассом с check_series_type=True (GH 32670).

  • Получение отсутствующего атрибута в DataFrame.query() или DataFrame.eval() строка вызывает правильное AttributeError (GH 32408)

  • Исправлена ошибка в pandas.testing.assert_series_equal() где проверялись dtypes для Interval и ExtensionArray операнды, когда check_dtype был False (GH 32747)

  • Ошибка в DataFrame.__dir__() вызывал segfault при использовании суррогатов Unicode в имени столбца (GH 25509)

  • Ошибка в DataFrame.equals() и Series.equals() в разрешении подклассам быть равными (GH 34402).

Участники#

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

  • 3vts +

  • A Brooks +

  • Abbie Popa +

  • Achmad Syarif Hidayatullah +

  • Adam W Bagaskarta +

  • Adrian Mastronardi +

  • Aidan Montare +

  • Akbar Septriyan +

  • Akos Furton +

  • Alejandro Hall +

  • Alex Hall +

  • Alex Itkes +

  • Alex Kirko

  • Ali McMaster +

  • Alvaro Aleman +

  • Amy Graham +

  • Andrew Schonfeld +

  • Andrew Shumanskiy +

  • Эндрю Вьетеска +

  • Анжела Амброз

  • Anjali Singh +

  • Анна Даглис

  • Anthony Milbourne +

  • Antony Lee +

  • Ari Sosnovsky +

  • Arkadeep Adhikari +

  • Аруним Самудра +

  • Ашкан +

  • Ashwin Prakash Nalwade +

  • Ashwin Srinath +

  • Atsushi Nukariya +

  • Ayappan +

  • Айла Хан +

  • Барт +

  • Bart Broere +

  • Benjamin Beier Liu +

  • Benjamin Fischer +

  • Bharat Raghunathan

  • Bradley Dice +

  • Brendan Sullivan +

  • Brian Strand +

  • Carsten van Weelden +

  • Chamoun Saoma +

  • ChrisRobo +

  • Christian Chwala

  • Кристофер Уилан

  • Christos Petropoulos +

  • Chuanzhu Xu

  • CloseChoice +

  • Clément Robert +

  • CuylenE +

  • Дэн Бассон +

  • Daniel Saxton

  • Danilo Horta +

  • DavaIlhamHaeruzaman +

  • Дэйв Хиршфельд

  • Дэйв Хьюз

  • David Rouquet +

  • David S +

  • Deepyaman Datta

  • Dennis Bakhuis +

  • Derek McCammond +

  • теперь используется.

  • Дайан Траут

  • Dina +

  • Dom +

  • Drew Seibert +

  • EdAbati

  • Emiliano Jordan +

  • Erfan Nariman +

  • Eric Groszman +

  • Erik Hasse +

  • Erkam Uyanik +

  • Эван Д +

  • Evan Kanter +

  • Fangchen Li +

  • Farhan Reynaldo +

  • Farhan Reynaldo Hutabarat +

  • Florian Jetter +

  • Fred Reiss +

  • GYHHAHA +

  • Gabriel Moreira +

  • Gabriel Tutui +

  • Galuh Sahid

  • Gaurav Chauhan +

  • George Hartzell +

  • Gim Seng +

  • Giovanni Lanzani +

  • Gordon Chen +

  • Грэм Ветцлер +

  • Guillaume Lemaitre

  • Guillem Sánchez +

  • HH-MWB +

  • Harshavardhan Bachina

  • How Si Wei

  • Ian Eaves

  • Iqrar Agalosi Nureyza +

  • Ирв Ластиг

  • Iva Laginja +

  • JDkuba

  • Jack Greisman +

  • Jacob Austin +

  • Jacob Deppen +

  • Jacob Peacock +

  • Jake Tae +

  • Джейк Вандерплас +

  • James Cobon-Kerr

  • Jan Červenka +

  • Jan Škoda

  • Jane Chen +

  • Jean-Francois Zinque +

  • Jeanderson Barros Candido +

  • Jeff Reback

  • Jered Dominguez-Trujillo +

  • Jeremy Schendel

  • Jesse Farnham

  • Jiaxiang

  • Jihwan Song +

  • Joaquim L. Viegas +

  • Joel Nothman

  • John Bodley +

  • Джон Пейтон +

  • Jon Thielen +

  • Joris Van den Bossche

  • Jose Manuel Martí +

  • Joseph Gulian +

  • Josh Dimarsky

  • Joy Bhalla +

  • João Veiga +

  • Julian de Ruiter +

  • Justin Essert +

  • Джастин Чжэн

  • KD-dev-lab +

  • Kaiqi Dong

  • Karthik Mathur +

  • Kaushal Rohit +

  • Kee Chong Tan

  • Кен Манкофф +

  • Kendall Masse

  • Kenny Huynh +

  • Ketan +

  • Kevin Anderson +

  • Kevin Bowey +

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

  • Килиан Лирет +

  • Koki Nishihara +

  • Krishna Chivukula +

  • KrishnaSai2020 +

  • Lesley +

  • Lewis Cowles +

  • Linda Chen +

  • Linxiao Wu +

  • Lucca Delchiaro Costabile +

  • MBrouns +

  • Mabel Villalba

  • Mabroor Ahmed +

  • Madhuri Palanivelu +

  • Mak Sze Chun

  • Malcolm +

  • Марк Гарсия

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

  • Мариан Денеш +

  • Martin Bjeldbak Madsen +

  • Martin Durant +

  • Martin Fleischmann +

  • Martin Jones +

  • Martin Winkel

  • Мартина Офелайн +

  • Marvzinc +

  • María Marino +

  • Matheus Cardoso +

  • Mathis Felardos +

  • Мэтт Рёшке

  • Matteo Felici +

  • Matteo Santamaria +

  • Мэтью Рёшке

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

  • Max Chen

  • Max Halford +

  • Mayank Bisht +

  • Megan Thong +

  • Michael Marino +

  • Miguel Marques +

  • Mike Kutzma

  • Мохаммад Хаснаин Мохсин Раджан +

  • Mohammad Jafar Mashhadi +

  • MomIsBestFriend

  • Моника +

  • Natalie Jann

  • Nate Armstrong +

  • Nathanael +

  • Nick Newman +

  • Nico Schlömer +

  • Niklas Weber +

  • ObliviousParadigm +

  • Ольга Ляшевская +

  • OlivierLuG +

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

  • Parallels +

  • Патрик +

  • Patrick Cando +

  • Paul Lilley +

  • Пол Сандерс +

  • Pearcekieser +

  • Pedro Larroy +

  • Pedro Reys

  • Peter Bull +

  • Peter Steinbach +

  • Phan Duc Nhat Minh +

  • Phil Kirlin +

  • Пьер-Ив Бургиньон +

  • Piotr Kasprzyk +

  • Piotr Niełacny +

  • Prakhar Pandey

  • Prashant Anand +

  • Puneetha Pai +

  • Quang Nguyễn +

  • Rafael Jaimes III +

  • Rafif +

  • RaisaDZ +

  • Rakshit Naidu +

  • Ram Rachum +

  • Красный +

  • Ricardo Alanis +

  • Richard Shadrach +

  • Rik-de-Kort

  • Robert de Vries

  • Робин к Роксель +

  • Roger Erens +

  • Rohith295 +

  • Roman Yurchak

  • Ror +

  • Rushabh Vasani

  • Ryan

  • Ryan Nazareth

  • SAI SRAVAN MEDICHERLA +

  • SHUBH CHATTERJEE +

  • Sam Cohan

  • Samira-g-js +

  • Sandu Ursu +

  • Sang Agung +

  • SanthoshBala18 +

  • Sasidhar Kasturi +

  • SatheeshKumar Mohan +

  • Saul Shanabrook

  • Scott Gigante +

  • Sebastian Berg +

  • Sebastián Vanrell

  • Sergei Chipiga +

  • Sergey +

  • ShilpaSugan +

  • Simon Gibbons

  • Simon Hawkins

  • Simon Legner +

  • Soham Tiwari +

  • Song Wenhao +

  • Souvik Mandal

  • Спенсер Кларк

  • Steffen Rehberg +

  • Steffen Schmitz +

  • Stijn Van Hoey

  • Stéphan Taljaard

  • SultanOrazbayev +

  • Sumanau Sareen

  • SurajH1 +

  • Suvayu Ali +

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

  • Thomas J Fan +

  • Thomas Li

  • Томас Смит +

  • Tim Swast

  • Tobias Pitters +

  • Tom +

  • Tom Augspurger

  • Uwe L. Korn

  • Valentin Iovene +

  • Vandana Iyer +

  • Venkatesh Datta +

  • Vijay Sai Mutyala +

  • Vikas Pandey

  • Vipul Rai +

  • Vishwam Pandya +

  • Владимир Беркутов +

  • Уилл Айд

  • Will Holmgren

  • William +

  • William Ayd

  • Yago González +

  • Yosuke KOBAYASHI +

  • Zachary Lawrence +

  • Zaky Bilfagih +

  • Zeb Nicholls +

  • alimcmaster1

  • alm +

  • андхикаюсуп +

  • andresmcneill +

  • avinashpancham +

  • benabel +

  • bernie gray +

  • biddwan09 +

  • brock +

  • chris-b1

  • cleconte987 +

  • dan1261 +

  • david-cortes +

  • davidwales +

  • dequadras +

  • dhuettenmoser +

  • dilex42 +

  • elmonsomiat +

  • epizzigoni +

  • fjetter

  • gabrielvf1 +

  • gdex1 +

  • gfyoung

  • guru kiran +

  • h-vishal

  • iamshwin

  • jamin-aws-ospo +

  • jbrockmendel

  • jfcorbett +

  • jnecus +

  • kernc

  • kota matsuoka +

  • kylekeppler +

  • leandermaben +

  • link2xt +

  • manoj_koneni +

  • marydmit +

  • masterpiga +

  • maxime.song +

  • mglasder +

  • moaraccounts +

  • mproszewska

  • neilkg

  • nrebena

  • ossdev07 +

  • paihu

  • pan Jacek +

  • partev +

  • patrick +

  • pedrooa +

  • pizzathief +

  • proost

  • pvanhauw +

  • rbenes

  • rebecca-palmer

  • rhshadrach +

  • rjfs +

  • s-scherrer +

  • использование +

  • sagungrp +

  • salem3358 +

  • saloni30 +

  • smartswdeveloper +

  • smartvinnetou +

  • themien +

  • timhunderwood +

  • tolhassianipar +

  • tonywu1999

  • tsvikas

  • tv3141

  • venkateshdatta1993 +

  • vivikelapoutre +

  • willbowditch +

  • willpeppo +

  • za +

  • zaki-indra +