2.2.0 新特性 (2024 年 1 月 19 日)#

这是 pandas 2.2.0 中的变化。有关包括其他 pandas 版本在内的完整更新日志,请参阅发布说明

pandas 3.0 的未来变化#

pandas 3.0 将为 pandas 的默认行为带来两项重大变更。

写时复制 (Copy-on-Write)#

当前可选的写时复制模式将在 pandas 3.0 中默认启用。将不再提供保持当前行为启用的选项。新的行为语义在写时复制用户指南中有所解释。

从 pandas 2.0 开始,可以通过以下选项启用新行为

pd.options.mode.copy_on_write = True

此项变更带来了 pandas 在处理复制和视图方式上的不同行为变化。其中一些变化允许明确弃用,例如链式赋值的变化。其他变化则更为微妙,因此警告信息隐藏在一个可在 pandas 2.2 中启用的选项后面。

pd.options.mode.copy_on_write = "warn"

此模式会在许多与大多数查询不相关的场景中发出警告。我们建议探索此模式,但并非必须消除所有这些警告。迁移指南更详细地解释了升级过程。

默认专用字符串数据类型(由 Arrow 支持)#

历史上,pandas 使用 NumPy 的对象数据类型表示字符串列。这种表示方式存在诸多问题,包括性能缓慢和内存占用大。这种情况将在 pandas 3.0 中改变。pandas 将开始把字符串列推断为一种新的 string 数据类型,该类型由 Arrow 支持,在内存中连续表示字符串。这将带来巨大的性能和内存改进。

旧行为

In [1]: ser = pd.Series(["a", "b"])
Out[1]:
0    a
1    b
dtype: object

新行为

In [1]: ser = pd.Series(["a", "b"])
Out[1]:
0    a
1    b
dtype: string

在这些场景中使用的字符串数据类型将主要表现得与 NumPy 对象类似,包括缺失值语义以及对这些列的常规操作。

此更改在整个 API 中还包含一些额外更改

  • 目前,指定 dtype="string" 会创建一个由存储在 NumPy 数组中的 Python 字符串支持的 dtype。这将在 pandas 3.0 中改变,此 dtype 将创建一个由 Arrow 支持的字符串列。

  • 列名和索引也将由 Arrow 字符串支持。

  • 为适应此更改,PyArrow 将成为 pandas 3.0 的必需依赖项。

可以通过以下方式启用未来的 dtype 推断逻辑

pd.options.future.infer_string = True

增强功能#

to_sql 和 read_sql 中的 ADBC 驱动程序支持#

read_sql()to_sql() 现在支持 Apache Arrow ADBC 驱动程序。与通过 SQLAlchemy 使用的传统驱动程序相比,ADBC 驱动程序应提供显著的性能改进、更好的类型支持和更清晰的空值处理。

import adbc_driver_postgresql.dbapi as pg_dbapi

df = pd.DataFrame(
    [
        [1, 2, 3],
        [4, 5, 6],
    ],
    columns=['a', 'b', 'c']
)
uri = "postgresql://postgres:postgres@localhost/postgres"
with pg_dbapi.connect(uri) as conn:
    df.to_sql("pandas_table", conn, index=False)

# for round-tripping
with pg_dbapi.connect(uri) as conn:
    df2 = pd.read_sql("pandas_table", conn)

Arrow 类型系统提供了更广泛的类型,可以更紧密地匹配 PostgreSQL 等数据库提供的类型。为了说明这一点,请注意以下不同数据库和 pandas 后端中可用类型的(非详尽)列表

NumPy/pandas

Arrow

PostgreSQL

SQLite

int16/Int16

int16

SMALLINT

INTEGER

int32/Int32

int32

INTEGER

INTEGER

int64/Int64

int64

BIGINT

INTEGER

float32

float32

REAL

REAL

float64

float64

DOUBLE PRECISION

REAL

object

string

TEXT

TEXT

bool

bool_

BOOLEAN

datetime64[ns]

timestamp(us)

TIMESTAMP

datetime64[ns,tz]

timestamp(us,tz)

TIMESTAMPTZ

date32

DATE

month_day_nano_interval

INTERVAL

binary

BINARY

BLOB

decimal128

DECIMAL [1]

list

ARRAY [1]

struct

COMPOSITE TYPE

[1]

注释

如果您有兴趣在 DataFrame 的整个生命周期中尽可能地保留数据库类型,建议用户利用 read_sql()dtype_backend="pyarrow" 参数

# for round-tripping
with pg_dbapi.connect(uri) as conn:
    df2 = pd.read_sql("pandas_table", conn, dtype_backend="pyarrow")

这将阻止您的数据转换为传统的 pandas/NumPy 类型系统,后者通常会将 SQL 类型以无法往返转换的方式进行转换。

有关 ADBC 驱动程序及其开发状态的完整列表,请参阅 ADBC 驱动程序实现状态 文档。

根据一个或多个条件创建 pandas Series#

已添加 Series.case_when() 函数,用于根据一个或多个条件创建 Series 对象。 (GH 39154)

In [1]: import pandas as pd

In [2]: df = pd.DataFrame(dict(a=[1, 2, 3], b=[4, 5, 6]))

In [3]: default=pd.Series('default', index=df.index)

In [4]: default.case_when(
   ...:      caselist=[
   ...:          (df.a == 1, 'first'),                              # condition, replacement
   ...:          (df.a.gt(1) & df.b.eq(5), 'second'),  # condition, replacement
   ...:      ],
   ...: )
   ...: 
Out[4]: 
0      first
1     second
2    default
dtype: object

用于 NumPy 可空类型和 Arrow 类型的 to_numpy 转换为合适的 NumPy dtype#

用于 NumPy 可空类型和 Arrow 类型的 to_numpy 现在将转换为合适的 NumPy dtype,而不是用于可空类型和 PyArrow 支持的扩展 dtypes 的 object dtype。

旧行为

In [1]: ser = pd.Series([1, 2, 3], dtype="Int64")
In [2]: ser.to_numpy()
Out[2]: array([1, 2, 3], dtype=object)

新行为

In [5]: ser = pd.Series([1, 2, 3], dtype="Int64")

In [6]: ser.to_numpy()
Out[6]: array([1, 2, 3])

In [7]: ser = pd.Series([1, 2, 3], dtype="timestamp[ns][pyarrow]")

In [8]: ser.to_numpy()
Out[8]: 
array(['1970-01-01T00:00:00.000000001', '1970-01-01T00:00:00.000000002',
       '1970-01-01T00:00:00.000000003'], dtype='datetime64[ns]')

默认的 NumPy dtype(不带任何参数)确定如下

  • 浮点 dtypes 被转换为 NumPy 浮点数

  • 不含缺失值的整数 dtypes 被转换为 NumPy 整数 dtypes

  • 含有缺失值的整数 dtypes 被转换为 NumPy 浮点 dtypes,并使用 NaN 作为缺失值指示符

  • 不含缺失值的布尔 dtypes 被转换为 NumPy 布尔 dtype

  • 含有缺失值的布尔 dtypes 保留对象 dtype

  • datetime 和 timedelta 类型分别被转换为 NumPy datetime64 和 timedelta64 类型,并使用 NaT 作为缺失值指示符

PyArrow 结构化数据的 Series.struct 访问器#

Series.struct 访问器为处理 struct[pyarrow] dtype 的 Series 数据提供属性和方法。例如,Series.struct.explode() 将 PyArrow 结构化数据转换为 pandas DataFrame。 (GH 54938)

In [9]: import pyarrow as pa

In [10]: series = pd.Series(
   ....:     [
   ....:         {"project": "pandas", "version": "2.2.0"},
   ....:         {"project": "numpy", "version": "1.25.2"},
   ....:         {"project": "pyarrow", "version": "13.0.0"},
   ....:     ],
   ....:     dtype=pd.ArrowDtype(
   ....:         pa.struct([
   ....:             ("project", pa.string()),
   ....:             ("version", pa.string()),
   ....:         ])
   ....:     ),
   ....: )
   ....: 

In [11]: series.struct.explode()
Out[11]: 
   project version
0   pandas   2.2.0
1    numpy  1.25.2
2  pyarrow  13.0.0

使用 Series.struct.field() 索引(可能嵌套的)结构体字段。

In [12]: series.struct.field("project")
Out[12]: 
0     pandas
1      numpy
2    pyarrow
Name: project, dtype: string[pyarrow]

PyArrow 列表数据的 Series.list 访问器#

Series.list 访问器为处理 list[pyarrow] dtype 的 Series 数据提供属性和方法。例如,Series.list.__getitem__() 允许在 Series 中索引 pyarrow 列表。 (GH 55323)

In [13]: import pyarrow as pa

In [14]: series = pd.Series(
   ....:     [
   ....:         [1, 2, 3],
   ....:         [4, 5],
   ....:         [6],
   ....:     ],
   ....:     dtype=pd.ArrowDtype(
   ....:         pa.list_(pa.int64())
   ....:     ),
   ....: )
   ....: 

In [15]: series.list[0]
Out[15]: 
0    1
1    4
2    6
dtype: int64[pyarrow]

read_excel() 的 Calamine 引擎#

read_excel() 中添加了 calamine 引擎。它使用 python-calamine,该库为 Rust 库 calamine 提供了 Python 绑定。此引擎支持 Excel 文件(.xlsx.xlsm.xls.xlsb)和 OpenDocument 电子表格(.ods)。 (GH 50395)

该引擎有两个优点

  1. Calamine 通常比其他引擎更快,一些基准测试显示其速度比“openpyxl”快 5 倍,比“odf”快 20 倍,比“pyxlsb”快 4 倍,比“xlrd”快 1.5 倍。但是,“openpyxl”和“pyxlsb”在从大型文件中读取少量行时更快,因为它们支持行的惰性迭代。

  2. Calamine 支持识别 .xlsb 文件中的 datetime,而“pyxlsb”是 pandas 中唯一能够读取 .xlsb 文件的其他引擎,却不支持此功能。

pd.read_excel("path_to_file.xlsb", engine="calamine")

更多信息,请参阅 IO 工具用户指南中的 Calamine (Excel 和 ODS 文件)

其他增强功能#

显著的错误修复#

这些是可能导致显著行为变化的错误修复。

merge()DataFrame.join() 现在一致遵循文档中描述的排序行为#

在之前的 pandas 版本中,merge()DataFrame.join() 并不总是返回符合文档中描述的排序行为的结果。现在,pandas 在合并和连接操作中遵循文档中描述的排序行为。 (GH 54611, GH 56426, GH 56443)

如文档所述,sort=True 会按字典序对结果 DataFrame 中的连接键进行排序。当 sort=False 时,连接键的顺序取决于连接类型(how 关键字)

  • how="left":保留左键的顺序

  • how="right":保留右键的顺序

  • how="inner":保留左键的顺序

  • how="outer":按字典序排序键

一个行为改变的例子是,左连接键不唯一且 sort=False 的内连接

In [16]: left = pd.DataFrame({"a": [1, 2, 1]})

In [17]: right = pd.DataFrame({"a": [1, 2]})

In [18]: result = pd.merge(left, right, how="inner", on="a", sort=False)

旧行为

In [5]: result
Out[5]:
   a
0  1
1  1
2  2

新行为

In [19]: result
Out[19]: 
   a
0  1
1  2
2  1

当级别不同时,merge()DataFrame.join() 不再重新排序级别#

在之前的 pandas 版本中,当连接两个具有不同级别的索引时,merge()DataFrame.join() 会重新排序索引级别。 (GH 34133)

In [20]: left = pd.DataFrame({"left": 1}, index=pd.MultiIndex.from_tuples([("x", 1), ("x", 2)], names=["A", "B"]))

In [21]: right = pd.DataFrame({"right": 2}, index=pd.MultiIndex.from_tuples([(1, 1), (2, 2)], names=["B", "C"]))

In [22]: left
Out[22]: 
     left
A B      
x 1     1
  2     1

In [23]: right
Out[23]: 
     right
B C       
1 1      2
2 2      2

In [24]: result = left.join(right)

旧行为

In [5]: result
Out[5]:
       left  right
B A C
1 x 1     1      2
2 x 2     1      2

新行为

In [25]: result
Out[25]: 
       left  right
A B C             
x 1 1     1      2
  2 2     1      2

提高的依赖项最低版本#

对于可选依赖项,一般建议使用最新版本。低于最低测试版本的可选依赖项可能仍然有效,但不支持。下表列出了已提高最低测试版本号的可选依赖项。

新最低版本

beautifulsoup4

4.11.2

blosc

1.21.3

bottleneck

1.3.6

fastparquet

2022.12.0

fsspec

2022.11.0

gcsfs

2022.11.0

lxml

4.9.2

matplotlib

3.6.3

numba

0.56.4

numexpr

2.8.4

qtpy

2.3.0

openpyxl

3.1.0

psycopg2

2.9.6

pyreadstat

1.2.0

pytables

3.8.0

pyxlsb

1.0.10

s3fs

2022.11.0

scipy

1.10.0

sqlalchemy

2.0.0

tabulate

0.9.0

xarray

2022.12.0

xlsxwriter

3.0.5

zstandard

0.19.0

pyqt5

5.15.8

tzdata

2022.7

更多信息请参见 依赖项可选依赖项

其他 API 变更#

弃用#

链式赋值#

为了准备 pandas 3.0 中复制/视图行为的更大变更(写时复制 (CoW), PDEP-7),我们开始弃用链式赋值

链式赋值是指您尝试通过两个后续索引操作更新 pandas DataFrame 或 Series。根据这些操作的类型和顺序,目前这种操作可能有效也可能无效。

一个典型示例如下

df = pd.DataFrame({"foo": [1, 2, 3], "bar": [4, 5, 6]})

# first selecting rows with a mask, then assigning values to a column
# -> this has never worked and raises a SettingWithCopyWarning
df[df["bar"] > 5]["foo"] = 100

# first selecting the column, and then assigning to a subset of that column
# -> this currently works
df["foo"][df["bar"] > 5] = 100

这个链式赋值的第二个示例目前可以更新原始的 df。这在 pandas 3.0 中将不再有效,因此我们开始弃用此功能

>>> df["foo"][df["bar"] > 5] = 100
FutureWarning: ChainedAssignmentError: behaviour will change in pandas 3.0!
You are setting values through chained assignment. Currently this works in certain cases, but when using Copy-on-Write (which will become the default behaviour in pandas 3.0) this will never work to update the original DataFrame or Series, because the intermediate object on which we are setting values will behave as a copy.
A typical example is when you are setting values in a column of a DataFrame, like:

df["col"][row_indexer] = value

Use `df.loc[row_indexer, "col"] = values` instead, to perform the assignment in a single step and ensure this keeps updating the original `df`.

See the caveats in the documentation: https://pandas.ac.cn/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy

您可以通过消除链式赋值的用法来修复此警告,并确保您的代码已为 pandas 3.0 做好准备。通常,这可以通过使用例如 .loc 在一个步骤中完成赋值。对于上面的示例,我们可以这样做

df.loc[df["bar"] > 5, "foo"] = 100

同样的弃用适用于以链式方式执行的原地方法,例如

>>> df["foo"].fillna(0, inplace=True)
FutureWarning: A value is trying to be set on a copy of a DataFrame or Series through chained assignment using an inplace method.
The behavior will change in pandas 3.0. This inplace method will never work because the intermediate object on which we are setting values always behaves as a copy.

For example, when doing 'df[col].method(value, inplace=True)', try using 'df.method({col: value}, inplace=True)' or df[col] = df[col].method(value) instead, to perform the operation inplace on the original object.

当目标是更新 DataFrame df 中的列时,这里的替代方法是在 df 本身上调用该方法,例如 df.fillna({"foo": 0}, inplace=True)

更多详细信息请参见 迁移指南

弃用偏移量中的别名 MQY 等,转而使用 MEQEYE#

弃用了以下频率别名 (GH 9586)

偏移量

已弃用别名

新别名

月末

M

ME

工作月末

BM

BME

半月末

SM

SME

自定义工作月末

CBM

CBME

季度末

Q

QE

工作季度末

BQ

BQE

年末

Y

YE

工作年末

BY

BYE

例如

之前行为:

In [8]: pd.date_range('2020-01-01', periods=3, freq='Q-NOV')
Out[8]:
DatetimeIndex(['2020-02-29', '2020-05-31', '2020-08-31'],
              dtype='datetime64[ns]', freq='Q-NOV')

未来行为:

In [26]: pd.date_range('2020-01-01', periods=3, freq='QE-NOV')
Out[26]: DatetimeIndex(['2020-02-29', '2020-05-31', '2020-08-31'], dtype='datetime64[ns]', freq='QE-NOV')

弃用自动向下转型#

弃用了在许多方法中对对象 dtype 结果的自动向下转型。由于行为依赖于值,这些方法会以难以预测的方式静默更改 dtype。此外,pandas 正在逐步取消静默 dtype 更改。 (GH 54710, GH 54261)

这些方法包括

未来请明确调用 DataFrame.infer_objects() 以复制当前行为。

result = result.infer_objects(copy=False)

或者使用 astype 将所有浮点数显式转换为整数。

设置以下选项以选择未来的行为

In [9]: pd.set_option("future.no_silent_downcasting", True)

其他弃用#

性能改进#

错误修复#

分类数据#

  • Categorical.isin() 对于包含重叠 Interval 值的分类数据引发 InvalidIndexError (GH 34974)

  • CategoricalDtype.__eq__() 中的错误,对于混合类型的无序分类数据返回 False (GH 55468)

  • 在将 pa.dictionary 转换为 CategoricalDtype 时,使用 pa.DictionaryArray 作为类别时出错 (GH 56672)

日期时间类#

  • DatetimeIndex 构造中的错误,当同时传递 tzdayfirstyearfirst 时,会忽略 dayfirst/yearfirst (GH 55813)

  • DatetimeIndex 中的错误,当传递浮点对象的对象数据类型 ndarray 和 tz 时,结果本地化不正确 (GH 55780)

  • Series.isin() 中的错误,对于 DatetimeTZDtype 数据类型和所有比较值都是 NaT 的情况,即使系列包含 NaT 条目,也错误地返回全 False (GH 56427)

  • concat() 中的错误,当连接全NA DataFrame 和 DatetimeTZDtype 数据类型 DataFrame 时引发 AttributeError (GH 52093)

  • testing.assert_extension_array_equal() 中的错误,在比较分辨率时可能使用了错误的单位 (GH 55730)

  • to_datetime()DatetimeIndex 中的错误,当传递混合字符串和数字类型的列表时,错误地引发异常 (GH 55780)

  • to_datetime()DatetimeIndex 中的错误,当传递包含混合时区或混合时区意识的混合类型对象时未能引发 ValueError (GH 55693)

  • Tick.delta() 中的错误,当使用非常大的刻度时引发 OverflowError 而不是 OutOfBoundsTimedelta (GH 55503)

  • DatetimeIndex.shift() 中的错误,非纳秒分辨率的数据错误地返回纳秒分辨率的结果 (GH 56117)

  • DatetimeIndex.union() 中的错误,对于具有相同时区但不同单位的时区感知索引返回对象数据类型 (GH 55238)

  • Index.is_monotonic_increasing()Index.is_monotonic_decreasing() 中的错误,当索引中的第一个值是 NaT 时,总是将 Index.is_unique() 缓存为 True (GH 55755)

  • Index.view() 中的错误,转换为不受支持分辨率的 datetime64 数据类型时错误地引发异常 (GH 55710)

  • Series.dt.round() 中的错误,对于非纳秒分辨率和 NaT 条目,错误地引发 OverflowError (GH 56158)

  • Series.fillna() 中的错误,对于非纳秒分辨率数据类型和更高分辨率的向量值,返回不正确(内部损坏)的结果 (GH 56410)

  • Timestamp.unit() 中的错误,从具有分钟或小时分辨率和时区偏移的 ISO8601 格式字符串中推断不正确 (GH 56208)

  • .astype 中的错误,从更高分辨率的 datetime64 数据类型转换为更低分辨率的 datetime64 数据类型(例如 datetime64[us]->datetime64[ms])时,在接近下限时默默溢出 (GH 55979)

  • Week 偏移量添加到或从具有非纳秒分辨率的 datetime64 SeriesIndexDataFrame 列中减去时返回不正确结果的错误 (GH 55583)

  • 将具有 offset 属性的 BusinessDay 偏移量添加到或从非纳秒 IndexSeriesDataFrame 列中减去时给出不正确结果的错误 (GH 55608)

  • 将带有微秒组件的 DateOffset 对象添加到或从具有非纳秒分辨率的 datetime64 IndexSeriesDataFrame 列中减去的错误 (GH 55595)

  • 将非常大的 Tick 对象添加到或从 TimestampTimedelta 对象中减去时引发 OverflowError 而不是 OutOfBoundsTimedelta 的错误 (GH 55503)

  • 创建具有非纳秒 DatetimeTZDtypeIndexSeriesDataFrame,并且输入在纳秒分辨率下会超出范围时,错误地引发 OutOfBoundsDatetime 的错误 (GH 54620)

  • 创建具有非纳秒 datetime64 (或 DatetimeTZDtype) 的 IndexSeriesDataFrame,并将混合数字输入视为纳秒而不是数据类型单位的倍数(非混合数字输入会发生这种情况)的错误 (GH 56004)

  • 创建具有非纳秒 datetime64 数据类型且输入对于 datetime64[ns] 将超出范围时,错误地引发 OutOfBoundsDatetime 的错误 (GH 55756)

  • 解析具有纳秒分辨率但非 ISO8601 格式的日期时间字符串时错误地截断亚微秒组件的错误 (GH 56051)

  • 解析具有亚秒分辨率和尾随零的日期时间字符串时错误地推断秒或毫秒分辨率的错误 (GH 55737)

  • to_datetime() 的结果中,浮点数据类型参数的 unitTimestamp 的逐点结果不匹配的错误 (GH 56037)

  • 修复了回归问题,其中 concat() 在连接具有不同分辨率的 datetime64 列时会引发错误 (GH 53641)

时间差#

  • Timedelta 构造中引发 OverflowError 而不是 OutOfBoundsTimedelta 的错误 (GH 55503)

  • TimedeltaIndexSeries 的渲染 (__repr__) 中,对于具有非纳秒分辨率且条目都是24小时倍数的 timedelta64 值,未能使用纳秒情况下的紧凑表示的错误 (GH 55405)

时区#

  • AbstractHolidayCalendar 中的错误,在计算假期观察结果时未传播时区数据 (GH 54580)

  • Timestamp 构造中,当使用一个模糊值和 pytz 时区时未能引发 pytz.AmbiguousTimeError 的错误 (GH 55657)

  • Timestamp.tz_localize() 中的错误,在夏令时期间使用 nonexistent="shift_forward 绕过 UTC+0 (GH 51501)

数字#

转换#

  • DataFrame.astype() 中的错误,当对未解封的数组调用 str 时 - 数组可能会就地改变 (GH 54654)

  • DataFrame.astype() 中的错误,其中 errors="ignore" 对扩展类型无效 (GH 54654)

  • Series.convert_dtypes() 未将所有 NA 列转换为 null[pyarrow] 的错误 (GH 55346)

  • :meth:DataFrame.loc 中的错误,在使用完整的列设置器(例如 df.loc[:, 'a'] = incompatible_value)分配具有不同数据类型的 Series 时,未抛出“不兼容数据类型警告”(参见 PDEP6)(GH 39584)

字符串#

区间#

索引#

缺失值处理#

多级索引#

输入/输出#

周期#

  • PeriodIndex 构造中存在错误,当传入 dataordinal**fields 中多于一个参数时,未能引发 ValueError (GH 55961)

  • Period 加法中存在错误,会默默地回绕而不是引发 OverflowError (GH 55503)

  • 从带有非纳秒单位的 PeriodDtype 使用 astype 转换为 datetime64DatetimeTZDtype 时存在错误,会错误地返回纳秒单位 (GH 55958)

绘图#

分组/重采样/滚动#

重塑#

稀疏#

  • arrays.SparseArray.take() 中存在错误,当使用与数组填充值不同的填充值时 (GH 55181)

其他#

贡献者#

共有 162 人为本次发布贡献了补丁。名字旁边带有“+”的人是首次贡献补丁。

  • AG

  • Aaron Rahman +

  • Abdullah Ihsan Secer +

  • Abhijit Deo +

  • Adrian D’Alessandro

  • Ahmad Mustafa Anis +

  • Amanda Bizzinotto

  • Amith KK +

  • Aniket Patil +

  • Antonio Fonseca +

  • Artur Barseghyan

  • Ben Greiner

  • Bill Blum +

  • Boyd Kane

  • Damian Kula

  • Dan King +

  • Daniel Weindl +

  • Daniele Nicolodi

  • David Poznik

  • David Toneian +

  • Dea María Léon

  • Deepak George +

  • Dmitriy +

  • Dominique Garmier +

  • Donald Thevalingam +

  • Doug Davis +

  • Dukastlik +

  • Elahe Sharifi +

  • Eric Han +

  • Fangchen Li

  • Francisco Alfaro +

  • Gadea Autric +

  • Guillaume Lemaitre

  • Hadi Abdi Khojasteh

  • Hedeer El Showk +

  • Huanghz2001 +

  • Isaac Virshup

  • Issam +

  • Itay Azolay +

  • Itayazolay +

  • Jaca +

  • Jack McIvor +

  • JackCollins91 +

  • James Spencer +

  • Jay

  • Jessica Greene

  • Jirka Borovec +

  • JohannaTrost +

  • John C +

  • Joris Van den Bossche

  • José Lucas Mayer +

  • José Lucas Silva Mayer +

  • João Andrade +

  • Kai Mühlbauer

  • Katharina Tielking, MD +

  • Kazuto Haruguchi +

  • Kevin

  • Lawrence Mitchell

  • Linus +

  • Linus Sommer +

  • Louis-Émile Robitaille +

  • Luke Manley

  • Lumberbot (aka Jack)

  • Maggie Liu +

  • MainHanzo +

  • Marc Garcia

  • Marco Edward Gorelli

  • MarcoGorelli

  • Martin Šícho +

  • Mateusz Sokół

  • Matheus Felipe +

  • Matthew Roeschke

  • Matthias Bussonnier

  • Maxwell Bileschi +

  • Michael Tiemann

  • Michał Górny

  • Molly Bowers +

  • Moritz Schubert +

  • NNLNR +

  • Natalia Mokeeva

  • Nils Müller-Wendt +

  • Omar Elbaz

  • Pandas Development Team

  • Paras Gupta +

  • Parthi

  • Patrick Hoefler

  • Paul Pellissier +

  • Paul Uhlenbruck +

  • Philip Meier

  • Philippe THOMY +

  • Quang Nguyễn

  • Raghav

  • Rajat Subhra Mukherjee

  • Ralf Gommers

  • Randolf Scholz +

  • Richard Shadrach

  • Rob +

  • Rohan Jain +

  • Ryan Gibson +

  • Sai-Suraj-27 +

  • Samuel Oranyeli +

  • Sara Bonati +

  • Sebastian Berg

  • Sergey Zakharov +

  • Shyamala Venkatakrishnan +

  • StEmGeo +

  • Stefanie Molin

  • Stijn de Gooijer +

  • Thiago Gariani +

  • Thomas A Caswell

  • Thomas Baumann +

  • Thomas Guillet +

  • Thomas Lazarus +

  • Thomas Li

  • Tim Hoffmann

  • Tim Swast

  • Tom Augspurger

  • Toro +

  • Torsten Wörtwein

  • Ville Aikas +

  • Vinita Parasrampuria +

  • Vyas Ramasubramani +

  • William Andrea

  • William Ayd

  • Willian Wang +

  • Xiao Yuan

  • Yao Xiao

  • Yves Delley

  • Zemux1613 +

  • Ziad Kermadi +

  • aaron-robeson-8451 +

  • aram-cinnamon +

  • caneff +

  • ccccjone +

  • chris-caballero +

  • cobalt

  • color455nm +

  • denisrei +

  • dependabot[bot]

  • jbrockmendel

  • jfadia +

  • johanna.trost +

  • kgmuzungu +

  • mecopur +

  • mhb143 +

  • morotti +

  • mvirts +

  • omar-elbaz

  • paulreece

  • pre-commit-ci[bot]

  • raj-thapa

  • rebecca-palmer

  • rmhowe425

  • rohanjain101

  • shiersansi +

  • smij720

  • srkds +

  • taytzehao

  • torext

  • vboxuser +

  • xzmeng +

  • yashb +