2.1.0 版本的新功能(2023 年 8 月 30 日)#

这是 pandas 2.1.0 的更改。有关完整的更改日志(包括其他 pandas 版本),请参阅发布说明

增强功能#

PyArrow 将成为 pandas 3.0 的必需依赖项#

从 pandas 3.0 开始,PyArrow 将成为 pandas 的必需依赖项。此决定是基于 PDEP 10 作出的。

这将带来更多对 pandas 用户非常有益的更改,包括但不限于:

  • 默认将字符串推断为 PyArrow 支持的字符串,从而显著减少内存占用并大幅提升性能。

  • 默认使用 PyArrow 推断更复杂的数据类型(dtype),例如 Decimallistsbytesstructured data 等。

  • 与依赖于 Apache Arrow 的其他库具有更好的互操作性。

我们正在这里收集关于此决定的反馈。

默认避免对字符串使用 NumPy object dtype#

以前,所有字符串默认都存储在 NumPy object dtype 的列中。此版本引入了一个选项 future.infer_string,它会将所有字符串推断为 PyArrow 支持的字符串,其 dtype 为 "string[pyarrow_numpy]"。这是一种新的字符串 dtype 实现,它在比较操作中遵循 NumPy 的语义,并将返回 np.nan 作为缺失值指示符。设置此选项还将把 dtype "string" 推断为存储设置为 "pyarrow_numpy"StringDtype,而忽略选项 mode.string_storage 的值。

此选项仅在安装了 PyArrow 时有效。与 NumPy object 相比,PyArrow 支持的字符串显著减少了内存占用,并提供了巨大的性能改进(GH 54430)。

可以通过以下方式启用此选项:

pd.options.future.infer_string = True

此行为将在 pandas 3.0 中成为默认。

DataFrame 归约保留扩展数据类型(dtype)#

在 pandas 的先前版本中,DataFrame 归约(DataFrame.sum()DataFrame.mean() 等)的结果具有 NumPy dtypes,即使 DataFrame 包含扩展 dtypes。现在,当对具有共同 dtype 的 DataFrame 列进行归约时,pandas 可以保留其 dtypes(GH 52788)。

旧行为

In [1]: df = pd.DataFrame({"a": [1, 1, 2, 1], "b": [np.nan, 2.0, 3.0, 4.0]}, dtype="Int64")
In [2]: df.sum()
Out[2]:
a    5
b    9
dtype: int64
In [3]: df = df.astype("int64[pyarrow]")
In [4]: df.sum()
Out[4]:
a    5
b    9
dtype: int64

新行为

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

In [2]: df.sum()
Out[2]: 
a    5
b    9
dtype: Int64

In [3]: df = df.astype("int64[pyarrow]")

In [4]: df.sum()
Out[4]: 
a    5
b    9
dtype: int64[pyarrow]

请注意,现在 dtype 分别是 masked dtype 和 PyArrow dtype,而以前是 NumPy integer dtype。

为了允许 DataFrame 归约保留扩展 dtypes,ExtensionArray._reduce() 增加了一个新的关键字参数 keepdims。调用 ExtensionArray._reduce() 并设置 keepdims=True 应返回沿归约轴长度为 1 的数组。为了保持向后兼容性,该参数目前不是必需的,但将来会变成必需的。如果在签名中找不到该参数,DataFrame 归约将无法保留扩展 dtypes。此外,如果找不到该参数,将发出 FutureWarning,并且像 mypy 这样的类型检查器可能会抱怨签名与 ExtensionArray._reduce() 不兼容。

Copy-on-Write 改进#

  • func 就地修改 Series 时,Series.transform() 未遵循 Copy-on-Write(GH 53747

  • 调用 Index.values() 现在将返回一个只读的 NumPy 数组(GH 53704

  • Series 设置到 DataFrame 中时,现在创建的是惰性副本而不是深层副本(GH 53142

  • 当从 Index 对象字典构造 DataFrame 并指定 copy=False 时,DataFrame 构造函数现在将对这些 Index 对象使用惰性副本作为 DataFrame 的列(GH 52947

  • Series 或 DataFrame 的浅层复制 (df.copy(deep=False)) 现在也将返回行/列 Index 对象的浅层复制,而不仅仅是数据的浅层复制,即结果的索引不再与原始索引相同 (df.copy(deep=False).index is df.index 不再为 True)(GH 53721

  • DataFrame.head()DataFrame.tail() 现在将返回深层复制(GH 54011

  • DataFrame.eval() 添加惰性复制机制(GH 53746

  • 在启用 Copy-on-Write 时,尝试对临时列选择进行就地操作(例如,df["a"].fillna(100, inplace=True))现在将始终发出警告。在此模式下,这种就地操作将永远无效,因为该选择被视为临时副本。这适用于:

    • DataFrame.update / Series.update

    • DataFrame.fillna / Series.fillna

    • DataFrame.replace / Series.replace

    • DataFrame.clip / Series.clip

    • DataFrame.where / Series.where

    • DataFrame.mask / Series.mask

    • DataFrame.interpolate / Series.interpolate

    • DataFrame.ffill / Series.ffill

    • DataFrame.bfill / Series.bfill

新增 DataFrame.map() 方法并支持 ExtensionArrays#

已添加 DataFrame.map() 方法,并已弃用 DataFrame.applymap()DataFrame.map() 的功能与 DataFrame.applymap() 相同,但新名称更能清晰地表明这是 Series.map()DataFrame 版本(GH 52353)。

当给定一个可调用对象时,Series.map() 会将该可调用对象应用于 Series 的所有元素。类似地,DataFrame.map() 会将该可调用对象应用于 DataFrame 的所有元素,而 Index.map() 会将该可调用对象应用于 Index 的所有元素。

通常,不希望将可调用对象应用于数组中类似 nan 的值,为了避免这种情况,可以在调用 map 方法时使用 na_action="ignore" 参数,即 ser.map(func, na_action="ignore")。然而,对于许多 ExtensionArrayIndex 类型,na_action="ignore" 未实现,并且对于除可为空的数值类型(即 dtype 为 Int64 等)之外的任何 ExtensionArray 子类,na_action="ignore" 都无法正常工作。

na_action="ignore" 现在适用于所有数组类型(GH 52219GH 51645GH 51809GH 51936GH 52033GH 52096)。

以前的行为:

In [1]: ser = pd.Series(["a", "b", np.nan], dtype="category")
In [2]: ser.map(str.upper, na_action="ignore")
NotImplementedError
In [3]: df = pd.DataFrame(ser)
In [4]: df.applymap(str.upper, na_action="ignore")  # worked for DataFrame
     0
0    A
1    B
2  NaN
In [5]: idx = pd.Index(ser)
In [6]: idx.map(str.upper, na_action="ignore")
TypeError: CategoricalIndex.map() got an unexpected keyword argument 'na_action'

新行为:

In [5]: ser = pd.Series(["a", "b", np.nan], dtype="category")

In [6]: ser.map(str.upper, na_action="ignore")
Out[6]: 
0      A
1      B
2    NaN
dtype: category
Categories (2, object): ['A', 'B']

In [7]: df = pd.DataFrame(ser)

In [8]: df.map(str.upper, na_action="ignore")
Out[8]: 
     0
0    A
1    B
2  NaN

In [9]: idx = pd.Index(ser)

In [10]: idx.map(str.upper, na_action="ignore")
Out[10]: CategoricalIndex(['A', 'B', nan], categories=['A', 'B'], ordered=False, dtype='category')

此外,请注意 Categorical.map() 隐式地将其 na_action 默认设置为 "ignore"。此默认值已被正式弃用,将来会更改为 None,与其他所有数组类型保持一致。

DataFrame.stack() 的新实现#

pandas 重新实现了 DataFrame.stack()。要使用新实现,请传递参数 future_stack=True。这将成为 pandas 3.0 中唯一的选项。

以前的实现有两个主要的行为缺点。

  1. 以前的实现会不必要地在结果中引入 NA 值。用户可以通过传递 dropna=True(默认值)来自动移除 NA 值,但这也会移除输入中存在的 NA 值。请参见下面的示例。

  2. 以前使用 sort=True(默认值)的实现有时会排序结果索引的一部分,有时则不会。如果输入的列不是 MultiIndex,则结果索引将永远不会排序。如果列是 MultiIndex,则在大多数情况下,来自堆叠列级别而生成的结果索引中的级别会进行排序。在极少数情况下,此类级别会以非标准顺序排序,具体取决于列的创建方式。

新实现 (future_stack=True) 在堆叠多个级别时不再不必要地引入 NA 值,并且永不排序。因此,当使用 future_stack=True 时,参数 dropnasort 将不被使用,并且必须保持未指定状态。这些参数将在下一个主要版本中移除。

In [11]: columns = pd.MultiIndex.from_tuples([("B", "d"), ("A", "c")])

In [12]: df = pd.DataFrame([[0, 2], [1, 3]], index=["z", "y"], columns=columns)

In [13]: df
Out[13]: 
   B  A
   d  c
z  0  2
y  1  3

在旧版本 (future_stack=False) 中,默认的 dropna=True 会移除不必要引入的 NA 值,但在此过程中仍会将 dtype 强制转换为 float64。在新版本中,不会引入 NA 值,因此也不会强制转换 dtype。

In [14]: df.stack([0, 1], future_stack=False, dropna=True)
Out[14]: 
z  A  c    2.0
   B  d    0.0
y  A  c    3.0
   B  d    1.0
dtype: float64

In [15]: df.stack([0, 1], future_stack=True)
Out[15]: 
z  B  d    0
   A  c    2
y  B  d    1
   A  c    3
dtype: int64

如果输入包含 NA 值,旧版本在 dropna=True 时也会丢弃这些值,或在 dropna=False 时引入新的 NA 值。新版本保留输入中的所有值。

In [16]: df = pd.DataFrame([[0, 2], [np.nan, np.nan]], columns=columns)

In [17]: df
Out[17]: 
     B    A
     d    c
0  0.0  2.0
1  NaN  NaN

In [18]: df.stack([0, 1], future_stack=False, dropna=True)
Out[18]: 
0  A  c    2.0
   B  d    0.0
dtype: float64

In [19]: df.stack([0, 1], future_stack=False, dropna=False)
Out[19]: 
0  A  d    NaN
      c    2.0
   B  d    0.0
      c    NaN
1  A  d    NaN
      c    NaN
   B  d    NaN
      c    NaN
dtype: float64

In [20]: df.stack([0, 1], future_stack=True)
Out[20]: 
0  B  d    0.0
   A  c    2.0
1  B  d    NaN
   A  c    NaN
dtype: float64

其他增强功能#

向后不兼容的 API 变更#

Python 最低版本提高#

pandas 2.1.0 支持 Python 3.9 及更高版本。

依赖项最低版本提高#

部分依赖项的最低支持版本已更新。如果已安装,现在需要

最低版本

必需

已更改

numpy

1.22.4

X

X

mypy (dev)

1.4.1

X

beautifulsoup4

4.11.1

X

bottleneck

1.3.4

X

dataframe-api-compat

0.1.7

X

fastparquet

0.8.1

X

fsspec

2022.05.0

X

hypothesis

6.46.1

X

gcsfs

2022.05.0

X

jinja2

3.1.2

X

lxml

4.8.0

X

numba

0.55.2

X

numexpr

2.8.0

X

openpyxl

3.0.10

X

pandas-gbq

0.17.5

X

psycopg2

2.9.3

X

pyreadstat

1.1.5

X

pyqt5

5.15.6

X

pytables

3.7.0

X

pytest

7.3.2

X

python-snappy

0.6.1

X

pyxlsb

1.0.9

X

s3fs

2022.05.0

X

scipy

1.8.1

X

sqlalchemy

1.4.36

X

tabulate

0.8.10

X

xarray

2022.03.0

X

xlsxwriter

3.0.3

X

zstandard

0.17.0

X

对于可选库,一般建议使用最新版本。

详情请参阅依赖项可选依赖项

其他 API 变更#

  • arrays.PandasArray 已重命名为 NumpyExtensionArray,并且附加的数据类型名称从 PandasDtype 更改为 NumpyEADtype;在下一个主要版本之前,导入 PandasArray 仍然有效(GH 53694

弃用#

在类似 setitem 的 Series 操作中弃用静默向上转型#

PDEP-6: https://pandas.ac.cn/pdeps/0006-ban-upcasting.html

在 Series(或 DataFrame 列)上,会静默向上转型 dtype 的类似 setitem 的操作已被弃用并显示警告。受影响的操作示例如下:

  • ser.fillna('foo', inplace=True)

  • ser.where(ser.isna(), 'foo', inplace=True)

  • ser.iloc[indexer] = 'foo'

  • ser.loc[indexer] = 'foo'

  • df.iloc[indexer, 0] = 'foo'

  • df.loc[indexer, 'a'] = 'foo'

  • ser[indexer] = 'foo'

其中 ser 是一个 Seriesdf 是一个 DataFrame,而 indexer 可以是切片、掩码、单个值、值列表或数组,或任何其他允许的索引器。

在将来的版本中,这些操作将引发错误,您应该先将数据类型转换为通用类型。

以前的行为:

In [1]: ser = pd.Series([1, 2, 3])

In [2]: ser
Out[2]:
0    1
1    2
2    3
dtype: int64

In [3]: ser[0] = 'not an int64'

In [4]: ser
Out[4]:
0    not an int64
1               2
2               3
dtype: object

新行为:

In [1]: ser = pd.Series([1, 2, 3])

In [2]: ser
Out[2]:
0    1
1    2
2    3
dtype: int64

In [3]: ser[0] = 'not an int64'
FutureWarning:
  Setting an item of incompatible dtype is deprecated and will raise an error in a future version of pandas.
  Value 'not an int64' has dtype incompatible with int64, please explicitly cast to a compatible dtype first.

In [4]: ser
Out[4]:
0    not an int64
1               2
2               3
dtype: object

为了保留当前行为,在上述情况下,您可以先将 ser 转换为 object dtype

In [21]: ser = pd.Series([1, 2, 3])

In [22]: ser = ser.astype('object')

In [23]: ser[0] = 'not an int64'

In [24]: ser
Out[24]: 
0    not an int64
1               2
2               3
dtype: object

根据具体用例,转换为不同的 dtype 可能更合适。例如,在以下情况中,我们将数据类型转换为 float64

In [25]: ser = pd.Series([1, 2, 3])

In [26]: ser = ser.astype('float64')

In [27]: ser[0] = 1.1

In [28]: ser
Out[28]: 
0    1.1
1    2.0
2    3.0
dtype: float64

欲了解更多信息,请参阅 https://pandas.ac.cn/pdeps/0006-ban-upcasting.html

弃用解析混合时区的时间日期#

解析混合时区的时间日期已被弃用并显示警告,除非用户将 utc=True 传递给 to_datetime()GH 50887

以前的行为:

In [7]: data = ["2020-01-01 00:00:00+06:00", "2020-01-01 00:00:00+01:00"]

In [8]:  pd.to_datetime(data, utc=False)
Out[8]:
Index([2020-01-01 00:00:00+06:00, 2020-01-01 00:00:00+01:00], dtype='object')

新行为:

In [9]: pd.to_datetime(data, utc=False)
FutureWarning:
  In a future version of pandas, parsing datetimes with mixed time zones will raise
  a warning unless `utc=True`. Please specify `utc=True` to opt in to the new behaviour
  and silence this warning. To create a `Series` with mixed offsets and `object` dtype,
  please use `apply` and `datetime.datetime.strptime`.
Index([2020-01-01 00:00:00+06:00, 2020-01-01 00:00:00+01:00], dtype='object')

为了抑制此警告并避免在未来版本的 pandas 中出现错误,请指定 utc=True

In [29]: data = ["2020-01-01 00:00:00+06:00", "2020-01-01 00:00:00+01:00"]

In [30]: pd.to_datetime(data, utc=True)
Out[30]: DatetimeIndex(['2019-12-31 18:00:00+00:00', '2019-12-31 23:00:00+00:00'], dtype='datetime64[ns, UTC]', freq=None)

要创建具有混合偏移和 object dtype 的 Series,请使用 applydatetime.datetime.strptime

In [31]: import datetime as dt

In [32]: data = ["2020-01-01 00:00:00+06:00", "2020-01-01 00:00:00+01:00"]

In [33]: pd.Series(data).apply(lambda x: dt.datetime.strptime(x, '%Y-%m-%d %H:%M:%S%z'))
Out[33]: 
0    2020-01-01 00:00:00+06:00
1    2020-01-01 00:00:00+01:00
dtype: object

其他弃用#

性能改进#

Bug 修复#

分类#

日期时间类#

  • DatetimeIndex.map() 在使用 na_action="ignore" 时现在按预期工作 (GH 51644)

  • DatetimeIndex.slice_indexer() 现在对非单调索引在切片边界不在索引中时引发 KeyError;此行为先前已弃用,但处理不一致 (GH 53983)

  • 修复了 DateOffset 中的错误,该错误在将 DateOffset 对象乘以常量时行为不一致 (GH 47953)

  • 修复了 date_range() 中的错误,该错误在 freq 为带有 nanosecondsDateOffset 时发生 (GH 46877)

  • 修复了 to_datetime() 中的错误,该错误在将包含 PyArrow 时间戳的 arrays.ArrowExtensionArraySeriesDataFrame 转换为 numpy datetime 时发生 (GH 52545)

  • 修复了 DatetimeArray.map()DatetimeIndex.map() 中的错误,其中提供的可调用对象是以数组为单位操作,而不是以元素为单位操作 (GH 51977)

  • 修复了 DataFrame.to_sql() 中的错误,该错误在处理 PyArrow 支持的日期类型 dtype 时引发 ValueError (GH 53854)

  • 修复了 Timestamp.date(), Timestamp.isocalendar(), Timestamp.timetuple()Timestamp.toordinal() 中的错误,对于超出 Python 标准库 datetime 模块支持范围的输入,它们返回不正确的结果 (GH 53668)

  • 修复了 Timestamp.round() 中的错误,当值接近实现边界时,它返回不正确的结果,而不是引发 OutOfBoundsDatetime (GH 51494)

  • 修复了从 datetime 或 timedelta 标量构造 SeriesDataFrame 时总是推断纳秒分辨率而不是根据输入推断的错误 (GH 52212)

  • 修复了从表示没有日期的字符串构造 Timestamp 时推断出不正确单位的错误 (GH 54097)

  • 修复了使用 ts_input=pd.NA 构造 Timestamp 时引发 TypeError 的错误 (GH 45481)

  • 修复了解析带有星期几但没有日的 datetime 字符串(例如“2023 Sept Thu”)时错误地引发 AttributeError 而不是 ValueError 的错误 (GH 52659)

  • 修复了当 Series 的 dtype 是非纳秒分辨率的时区感知 datetime 时,其 repr 引发 OutOfBoundsDatetime 的错误 (GH 54623)

时间差#

  • 修复了 TimedeltaIndex 除法或乘法导致 .freq 为“0 Days”而不是 None 的错误 (GH 51575)

  • 修复了 Timedelta 处理 NumPy timedelta64 对象时未正确引发 ValueError 的错误 (GH 52806)

  • 修复了 to_timedelta() 中的错误,该错误在将包含 pyarrow.durationArrowDtypeSeriesDataFrame 转换为 NumPy timedelta64 时发生 (GH 54298)

  • 修复了 Timedelta.__hash__() 中的错误,该错误在某些大秒分辨率值上引发 OutOfBoundsTimedelta (GH 54037)

  • 修复了 Timedelta.round() 中的错误,当值接近实现边界时,它返回不正确的结果,而不是引发 OutOfBoundsTimedelta (GH 51494)

  • 修复了 TimedeltaIndex.map() 中使用 na_action="ignore" 时的错误 (GH 51644)

  • 修复了 arrays.TimedeltaArray.map()TimedeltaIndex.map() 中的错误,其中提供的可调用对象是以数组为单位操作,而不是以元素为单位操作 (GH 51977)

时区#

  • 修复了 infer_freq() 中的错误,该错误对时区感知时间戳的 Series 引发 TypeError (GH 52456)

  • 修复了 DatetimeTZDtype.base() 中的错误,它总是返回一个纳秒分辨率的 NumPy dtype (GH 52705)

数值#

转换#

字符串#

  • 修复了 Series.str() 在迭代时未引发 TypeError 的错误 (GH 54173)

  • 修复了 DataFrame`repr 在处理 string-dtype 列时发生的错误 (GH 54797)

区间#

索引#

  • 修复了 DataFrame.__setitem__() 在将 DataFrame 设置到重复列时丢失 dtype 的错误 (GH 53143)

  • 修复了 DataFrame.__setitem__() 使用布尔掩码和 DataFrame.putmask() 处理混合非数值 dtypes 和非 NaN 值时错误地引发 TypeError 的错误 (GH 53291)

  • 修复了 DataFrame.iloc() 在仅使用 nan 作为元素时发生的错误 (GH 52234)

  • 修复了 Series.loc() 在将 Series 分配给 object dtype Series 的预定义索引时将 Series 强制转换为 np.dnarray 的错误 (GH 48933)

缺失值#

多级索引#

输入/输出#

Period#

  • PeriodDtype 构造函数中,未传递参数或传递 None 时未能引发 TypeError 的错误 (GH 27388)

  • PeriodDtype 构造函数中,对于不同的 DateOffset freq 输入,错误返回相同的 normalize 的错误 (GH 24121)

  • PeriodDtype 构造函数中,传递无效类型时引发 ValueError 而非 TypeError 的错误 (GH 51790)

  • PeriodDtype 中,对象在删除时可能仍保持存活的错误 (GH 54184)

  • read_csv() 中,当使用 engine="pyarrow" 时,未将空字符串处理为 null 值的错误 (GH 52087)

  • read_csv() 中,当使用 engine="pyarrow" 时,对于全是 null 的列,返回 object dtype 列而不是 float64 dtype 列的错误 (GH 52087)

  • Period.now() 中,不接受 freq 参数作为关键字参数的错误 (GH 53369)

  • PeriodIndex.map() 中,当使用 na_action="ignore" 时发生的错误 (GH 51644)

  • arrays.PeriodArray.map()PeriodIndex.map() 中,提供的可调用对象按数组而不是按元素操作的错误 (GH 51977)

  • 错误地允许使用 CustomBusinessDay freq 构建 PeriodPeriodDtype 的错误;请改用 BusinessDay (GH 52534)

绘图#

分组/重采样/滚动#

重塑#

稀疏#

  • 错误:SparseDtype 构造函数在为其子类型(必须是 NumPy dtype)提供不兼容的 dtype 时未能引发 TypeError (GH 53160)

  • 错误:arrays.SparseArray.map() 允许将填充值包含在稀疏值中 (GH 52095)

扩展数组#

  • 错误:ArrowStringArray 构造函数在处理字符串的字典类型时引发 ValueError (GH 54074)

  • 错误:DataFrame 构造函数在字典中给定带有扩展 dtype 的 Series 时未进行复制 (GH 53744)

  • 错误:ArrowExtensionArray 将 pandas 非纳秒级时间对象从非零值转换为零值 (GH 53171)

  • 错误:Series.quantile() 处理 PyArrow 时间类型时引发 ArrowInvalid (GH 52678)

  • 错误:Series.rank() 对于 Float64 dtype 的小值返回错误的顺序 (GH 52471)

  • 错误:Series.unique() 处理带有 NA 值的布尔 ArrowDtype 时出现错误 (GH 54667)

  • 错误:__iter__()__getitem__() 对于非纳秒级 dtype 返回 python datetime 和 timedelta 对象 (GH 53326)

  • 错误:factorize() 对于具有多个块的 pyarrow.dictionary 类型 pyarrow.chunked_array 返回不正确的唯一值 (GH 54844)

  • 错误:将 ExtensionArray 子类传递给 dtype 关键字时出现错误。现在将引发 UserWarning,建议传递实例代替 (GH 31356, GH 54592)

  • 错误:当列具有带有 pyarrow.ExtensionDtypeArrowDtype 时,DataFrame 的 repr 不起作用 (GH 54063)

  • 错误:掩码 ExtensionDtype(例如 Float64Dtype, BooleanDtype)的 __from_arrow__ 方法不接受 pyarrow.null() 类型的 PyArrow 数组 (GH 52223)

样式器#

  • 错误:Styler._copy() 调用 Styler 子类中被覆盖的方法 (GH 52728)

元数据#

其他#

贡献者#

共有 266 位贡献者为本次发布提交了补丁。名字旁带有“+”的人是首次贡献补丁。

  • AG +

  • Aarni Koskela

  • Adrian D’Alessandro +

  • Adrien RUAULT +

  • Ahmad +

  • Aidos Kanapyanov +

  • Alex Malins

  • Alexander Seiler +

  • Ali Asgar +

  • Allison Kwan

  • Amanda Bizzinotto +

  • Andres Algaba +

  • Angela Seo +

  • Anirudh Hegde +

  • Antony Evmorfopoulos +

  • An Anushka Bishnoi

  • ArnaudChanoine +

  • Artem Vorobyev +

  • Arya Sarkar +

  • Ashwin Srinath

  • Austin Au-Yeung +

  • Austin Burnett +

  • Bear +

  • Ben Mangold +

  • Bernardo Gameiro +

  • Boyd Kane +

  • Brayan Alexander Muñoz B +

  • Brock

  • Chetan0402 +

  • Chris Carini

  • ChristofKaufmann

  • Clark-W +

  • Conrad Mcgee Stocks

  • Corrie Bartelheimer +

  • Coulton Theuer +

  • D067751 +

  • Daniel Isaac

  • Daniele Nicolodi +

  • David Samuel +

  • David Seifert +

  • Dea Leon +

  • Dea María Léon

  • Deepyaman Datta

  • Denis Sapozhnikov +

  • Dharani Akurathi +

  • DimiGrammatikakis +

  • Dirk Ulbricht +

  • Dmitry Shemetov +

  • Dominik Berger

  • Efkan S. Goktepe +

  • Ege Özgüroğlu

  • Eli Schwartz

  • Erdi +

  • Fabrizio Primerano +

  • Facundo Batista +

  • Fangchen Li

  • Felipe Maion +

  • Francis +

  • Future Programmer +

  • Gabriel Kabbe +

  • Gaétan Ramet +

  • Gianluca Ficarelli

  • Godwill Agbehonou +

  • Guillaume Lemaitre

  • Guo Ci

  • Gustavo Vargas +

  • Hamidreza Sanaee +

  • HappyHorse +

  • Harald Husum +

  • Hugo van Kemenade

  • Ido Ronen +

  • Irv Lustig

  • JHM Darbyshire

  • JHM Darbyshire (iMac)

  • JJ +

  • Jarrod Millman

  • Jay +

  • Jeff Reback

  • Jessica Greene +

  • Jiawei Zhang +

  • Jinli Xiao +

  • Joanna Ge +

  • Jona Sassenhagen +

  • Jonas Haag

  • Joris Van den Bossche

  • Joshua Shew +

  • Julian Badillo

  • Julian Ortiz +

  • Julien Palard +

  • Justin Tyson +

  • Justus Magin

  • Kabiir Krishna +

  • Kang Su Min

  • Ketu Patel +

  • Kevin +

  • Kevin Anderson

  • Kevin Jan Anker

  • Kevin Klein +

  • Kevin Sheppard

  • Kostya Farber

  • LM +

  • Lars Lien Ankile +

  • Lawrence Mitchell

  • Liwei Cai +

  • Loic Diridollou

  • Luciana Solorzano +

  • Luke Manley

  • Lumberbot (aka Jack)

  • Marat Kopytjuk +

  • Marc Garcia

  • Marco Edward Gorelli

  • MarcoGorelli

  • Maria Telenczuk +

  • MarvinGravert +

  • Mateusz Sokół +

  • Matt Richards

  • Matthew Barber +

  • Matthew Roeschke

  • Matus Valo +

  • Mia Reimer +

  • Michael Terry +

  • Michael Tiemann +

  • Milad Maani Jou +

  • Miles Cranmer +

  • MirijaH +

  • Miyuu +

  • Natalia Mokeeva

  • Nathan Goldbaum +

  • Nicklaus Roach +

  • Nicolas Camenisch +

  • Nikolay Boev +

  • Nirav

  • Nishu Choudhary

  • Noa Tamir

  • Noy Hanan +

  • Numan +

  • Numan Ijaz +

  • Omar Elbaz +

  • Pandas Development Team

  • Parfait Gasana

  • Parthi

  • Patrick Hoefler

  • Patrick Schleiter +

  • Pawel Kranzberg +

  • Philip

  • Philip Meier +

  • Pranav Saibhushan Ravuri

  • PrathumP +

  • Rahul Siloniya +

  • Rajasvi Vinayak +

  • Rajat Subhra Mukherjee +

  • Ralf Gommers

  • RaphSku

  • Rebecca Chen +

  • Renato Cotrim Maciel +

  • Reza (Milad) Maanijou +

  • Richard Shadrach

  • Rithik Reddy +

  • Robert Luce +

  • Ronalido +

  • Rylie Wei +

  • SOUMYADIP MAL +

  • Sanjith Chockan +

  • Sayed Qaiser Ali +

  • Scott Harp +

  • Se +

  • Shashwat Agrawal

  • Simar Bassi +

  • Simon Brugman +

  • Simon Hawkins

  • Simon Høxbro Hansen

  • Snorf Yang +

  • Sortofamudkip +

  • Stefan Krawczyk

  • Stefanie Molin

  • Stefanie Senger

  • Stelios Petrakis +

  • Stijn Van Hoey

  • Sven

  • Sylvain MARIE

  • Sylvain Marié

  • Terji Petersen

  • Thierry Moisan

  • Thomas

  • Thomas A Caswell

  • Thomas Grainger

  • Thomas Li

  • Thomas Vranken +

  • Tianye Song +

  • Tim Hoffmann

  • Tim Loderhose +

  • Tim Swast

  • Timon Jurschitsch +

  • Tolker-KU +

  • Tomas Pavlik +

  • Toroi +

  • Torsten Wörtwein

  • Travis Gibbs +

  • Umberto Fasci +

  • Valerii +

  • VanMyHu +

  • Victor Momodu +

  • Vijay Vaidyanathan +

  • VomV +

  • William Andrea

  • William Ayd

  • Wolf Behrenhoff +

  • Xiao Yuan

  • Yao Xiao

  • Yasin Tatar

  • Yaxin Li +

  • Yi Wei +

  • Yulia +

  • Yusharth Singh +

  • Zach Breger +

  • Zhengbo Wang

  • abokey1 +

  • ahmad2901 +

  • assafam +

  • auderson

  • august-tengland +

  • bunardsheng +

  • cmmck +

  • cnguyen-03 +

  • coco +

  • dependabot[bot]

  • giplessis +

  • github-actions[bot]

  • gmaiwald +

  • gmollard +

  • jbrockmendel

  • kathleenhang

  • kevx82 +

  • lia2710 +

  • liang3zy22 +

  • ltartaro +

  • lusolorz +

  • m-ganko +

  • mKlepsch +

  • mattkeanny +

  • mrastgoo +

  • nabdoni +

  • omar-elbaz +

  • paulreece +

  • penelopeysm +

  • potap75 +

  • pre-commit-ci[bot] +

  • raanasn +

  • raj-thapa +

  • ramvikrams +

  • rebecca-palmer

  • reddyrg1 +

  • rmhowe425 +

  • segatrade +

  • shteken +

  • sweisss +

  • taytzehao

  • tntmatthews +

  • tpaxman +

  • tzehaoo +

  • v-mcoutinho +

  • wcgonzal +

  • yonashub

  • yusharth +

  • Ádám Lippai

  • Štěpán Műller +