Что нового в версии 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()теперь поддерживает метод интерполяции SciPyscipy.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аргумент ключевого слова. Сжатие может быть выведено или явно задано с помощью строки или словаря, содержащего как метод, так и любые дополнительные аргументы, которые передаются в библиотеку сжатия. Сжатие также было добавлено в низкоуровневые писатели файлов StataStataWriter,StataWriter117, иStataWriterUTF8(GH 26599).HDFStore.put()теперь принимаетtrack_timesпараметр. Этот параметр передаётся вcreate_tableметодPyTables(GH 32682).Series.plot()иDataFrame.plot()теперь принимаетxlabelиylabelпараметры для отображения меток на оси x и y (GH 9093).Сделано
RollingиExpandingiterable(GH 11704)Сделано
option_contextacontextlib.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_resultskwarg изpandas-gbq(GH 34639).DataFrame.cov()иSeries.cov()теперь поддерживает новый параметрddofдля поддержки степеней свободы дельты, как в соответствующих методах numpy (GH 34611).DataFrame.to_html()иDataFrame.to_string()’scol_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аргумент как псевдоним для tabulateshowindex(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_valuetoCategorical.take()вызываетValueErrorвместоTypeError(GH 33660)Объединение
Categoricalс целочисленными категориями и содержащий пропущенные значения со столбцом типа float в операциях, таких какconcat()илиappend()теперь будет приводить к столбцу с типом float вместо столбца с типом object (GH 33607)Ошибка, где
merge()не удалось выполнить соединение по не уникальным категориальным индексам (GH 28189)Ошибка при передаче категориальных данных в
Indexконструктор вместе сdtype=objectнекорректно возвращаетCategoricalIndexвместо object-dtypeIndex(GH 32167)Ошибка, где
Categoricalоператор сравнения__ne__некорректно вычислялось какFalseкогда любой элемент отсутствовал (GH 32276)Categorical.fillna()теперь принимаетCategoricalotherаргумент (GH 32420)Repr из
Categoricalне различал междуintиstr(GH 33676)
Datetimelike#
Передача целочисленного типа данных, отличного от
int64tonp.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илиNonebyTimedeltaнекорректно возвращает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-endiandatetime64тип данных (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-dtypeIndexкоторый не является полностью целочисленным (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()со словарем значений изменяет колонки с типом данныхinttofloat(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]
Ошибка в
MultiIndex.intersection()не гарантировал сохранение порядка приsort=False. (GH 31325)Ошибка в
DataFrame.truncate()удалялMultiIndexимена. (GH 34564)
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был поднят (AssertionErrorifmin_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()дает несовместимый тип при агрегировании BooleanSeries(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атрибут при преобразовании изFloat64IndextoInt64Index, или при приведении кExtensionArrayтип данных (GH 32013)Series.append()теперь вызоветTypeErrorкогда переданDataFrameили последовательность, содержащаяDataFrame(GH 31413)DataFrame.replace()иSeries.replace()вызоветTypeErrorifto_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 +