2.2.0 版本新功能 (2024 年 1 月 19 日)#
以下是 pandas 2.2.0 版本中的变更。有关包含其他 pandas 版本在内的完整变更日志,请参阅发布说明。
pandas 3.0 中即将发生的变更#
pandas 3.0 将带来两个对 pandas 默认行为的重大变更。
Copy-on-Write#
目前可选的 Copy-on-Write 模式将在 pandas 3.0 中默认启用。将不再提供保持当前行为启用的选项。新的行为语义在Copy-on-Write 用户指南中进行了解释。
可以自 pandas 2.0 版本起通过以下选项启用新行为:
pd.options.mode.copy_on_write = True
此变更带来了 pandas 在处理副本和视图时行为上的不同变化。其中一些变化允许明确弃用,例如链式赋值的变化。其他变化则更为微妙,因此这些警告隐藏在一个可在 pandas 2.2 中启用的选项后面。
pd.options.mode.copy_on_write = "warn"
此模式将在许多对大多数查询并非真正相关的场景中发出警告。我们建议探索此模式,但并非必须消除所有这些警告。迁移指南更详细地解释了升级过程。
默认使用专用的字符串数据类型(由 Arrow 提供支持)#
历史上,pandas 使用 NumPy 的 object 数据类型来表示字符串列。这种表示方式存在许多问题,包括性能慢和内存占用大。这将在 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
在这些场景中使用的 string 数据类型将大体上像 NumPy object 那样工作,包括缺失值语义以及对这些列的通用操作。
此变更包括对整个 API 的一些额外修改:
目前,指定
dtype="string"
会创建一个由存储在 NumPy 数组中的 Python 字符串支持的 dtype。这将在 pandas 3.0 中发生变化,此 dtype 将创建一个由 Arrow 支持的字符串列。列名和 Index 也将由 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 驱动程序应提供显著的性能改进、更好的类型支持和更清晰的 nullability 处理。
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 |
postgres |
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 |
|
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 |
|
注脚
如果您有兴趣在整个 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 nullable 和 Arrow 类型上的 to_numpy
转换为合适的 NumPy dtype#
NumPy nullable 和 Arrow 类型上的 to_numpy
现在将转换为合适的 NumPy dtype,而不是用于 nullable 和 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(不带任何参数)确定规则如下:
float dtypes 被转换为 NumPy floats
没有缺失值的 integer dtypes 被转换为 NumPy integer dtypes
带有缺失值的 integer dtypes 被转换为 NumPy float dtypes,并使用
NaN
作为缺失值指示符。没有缺失值的 boolean dtypes 被转换为 NumPy bool dtype
带有缺失值的 boolean dtypes 保留 object 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()
索引(可能嵌套的)struct 字段。
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 引擎#
calamine
引擎已添加到 read_excel()
函数中。它使用 python-calamine
,该库为 Rust 库 calamine 提供 Python 绑定。此引擎支持 Excel 文件(.xlsx
、.xlsm
、.xls
、.xlsb
)和 OpenDocument 电子表格(.ods
)。(GH 50395)
此引擎有两个优点:
Calamine 通常比其他引擎更快,一些基准测试显示结果比 ‘openpyxl’ 快 5 倍,比 ‘odf’ 快 20 倍,比 ‘pyxlsb’ 快 4 倍,比 ‘xlrd’ 快 1.5 倍。但是,由于对行进行惰性迭代,‘openpyxl’ 和 ‘pyxlsb’ 在读取大型文件中的少量行时更快。
Calamine 支持识别
.xlsb
文件中的 datetime,而 ‘pyxlsb’ 是 pandas 中唯一能读取.xlsb
文件的其他引擎。
pd.read_excel("path_to_file.xlsb", engine="calamine")
更多信息请参阅 IO 工具用户指南中的Calamine (Excel 和 ODS 文件)。
其他增强功能#
将方法参数设置为
multi
的to_sql()
在后端支持 Oracle。Series.attrs
/DataFrame.attrs
现在使用 deepcopy 来传播attrs
。(GH 54134)get_dummies()
现在返回与输入 dtype 兼容的扩展 dtypesboolean
或bool[pyarrow]
。(GH 56273)read_csv()
现在在使用engine="pyarrow"
时支持on_bad_lines
参数。(GH 54480)read_sas()
返回的datetime64
dtypes 的分辨率更好地匹配 SAS 中原生存储的分辨率,并避免在无法使用datetime64[ns]
dtype 存储的情况下返回 object-dtype。(GH 56127)read_spss()
现在返回一个DataFrame
,并在DataFrame.attrs
中存储元数据。(GH 54264)tseries.api.guess_datetime_format()
现在是公共 API 的一部分。(GH 54727)DataFrame.apply()
现在允许使用 numba(通过engine="numba"
)对传入的函数进行 JIT 编译,从而可能实现加速。(GH 54666)添加了
ExtensionArray._explode()
接口方法,允许扩展类型实现explode
方法。(GH 54833)添加了
ExtensionArray.duplicated()
,允许扩展类型实现duplicated
方法。(GH 55255)Series.ffill()
、Series.bfill()
、DataFrame.ffill()
和DataFrame.bfill()
增加了参数limit_area
;第三方ExtensionArray
作者需要将此参数添加到_pad_or_backfill
方法中。(GH 56492)允许通过
read_excel()
的engine_kwargs
参数将read_only
、data_only
和keep_links
参数传递给 openpyxl。(GH 55027)为带有
ArrowDtype
和 masked dtypes 实现了Series.interpolate()
和DataFrame.interpolate()
。(GH 56267)为
Series.value_counts()
实现了 masked algorithms。(GH 54984)为带有
pyarrow.duration
类型的ArrowDtype
实现了Series.dt()
方法和属性。(GH 52284)为
ArrowDtype
实现了Series.str.extract()
。(GH 56268)改进了在使用不支持作为 period 频率的频率(例如
"BMS"
)时,DatetimeIndex.to_period()
中出现的错误消息。(GH 56243)dtypes
string[pyarrow]
和string[pyarrow_numpy]
现在都利用 PyArrow 的large_string
类型来避免长列的溢出。(GH 56259)
值得注意的错误修复#
这些错误修复可能会带来值得注意的行为变化。
merge()
和 DataFrame.join()
现在一致遵循文档中描述的排序行为#
在之前的 pandas 版本中,merge()
和 DataFrame.join()
返回的结果并不总是遵循文档中描述的排序行为。pandas 现在在 merge 和 join 操作中遵循文档中描述的排序行为。(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 变更#
nullable 扩展 dtypes 的哈希值已更改,以提高哈希操作的性能。(GH 56507)
check_exact
现在仅对testing.assert_frame_equal()
和testing.assert_series_equal()
中的浮点 dtypes 生效。特别是,整数 dtypes 总是精确检查的。(GH 55882)
弃用#
链式赋值#
为准备 pandas 3.0 中即将发生的关于复制/视图行为的重大变更(写时复制 (Copy-on-Write / CoW), PDEP-7),我们开始弃用链式赋值 (chained assignment)。
链式赋值发生在您尝试通过两个连续的索引操作来更新 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
相同的弃用适用于链式调用的原地方法(inplace methods),例如
>>> 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)
。
更多详细信息请参阅迁移指南。
对于偏移量(offsets),弃用别名 M
、Q
、Y
等,推荐使用 ME
、QE
、YE
等#
弃用了以下频率别名(GH 9586)
偏移量 |
已弃用的别名 |
新别名 |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
例如
旧行为:
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')
弃用自动向下转型(downcasting)#
弃用了多种方法中对 object 数据类型(dtype)结果的自动向下转型。由于该行为依赖于值,这会以难以预测的方式静默地改变数据类型。此外,pandas 正在逐步淘汰静默的数据类型改变(GH 54710, GH 54261)。
这些方法包括
将来请显式调用 DataFrame.infer_objects()
以复制当前行为。
result = result.infer_objects(copy=False)
或者使用 astype
将所有舍入后的浮点数显式转换为整数。
设置以下选项可选择启用未来行为
In [9]: pd.set_option("future.no_silent_downcasting", True)
其他弃用#
更改了
Timedelta.resolution_string()
,使其返回h
、min
、s
、ms
、us
和ns
,而不是H
、T
、S
、L
、U
和N
,以便与频率别名中的相应弃用保持兼容(GH 52536)弃用了
offsets.Day.delta
、offsets.Hour.delta
、offsets.Minute.delta
、offsets.Second.delta
、offsets.Milli.delta
、offsets.Micro.delta
、offsets.Nano.delta
,请改用pd.Timedelta(obj)
(GH 55498)弃用了
pandas.api.types.is_interval()
和pandas.api.types.is_period()
,请改用isinstance(obj, pd.Interval)
和isinstance(obj, pd.Period)
(GH 55264)弃用了
read_gbq()
和DataFrame.to_gbq()
。请改用pandas_gbq.read_gbq
和pandas_gbq.to_gbq
https://pandas-gbq.readthedocs.io/en/latest/api.html(GH 55525)弃用了
DataFrameGroupBy.fillna()
和SeriesGroupBy.fillna()
;对于前向填充和后向填充,请改用DataFrameGroupBy.ffill()
、DataFrameGroupBy.bfill()
,或者使用DataFrame.fillna()
填充单个值(或 Series 的对应方法)(GH 55718)弃用了
DateOffset.is_anchored()
,对于非 Tick 子类,请改用obj.n == 1
(对于 Tick,此属性始终为 False)(GH 55388)弃用了
DatetimeArray.__init__()
和TimedeltaArray.__init__()
,请改用array()
(GH 55623)弃用了
Index.format()
,请改用index.astype(str)
或index.map(formatter)
(GH 55413)弃用了
Series.ravel()
,底层数组已经是 1D 的,因此 ravel 不是必需的(GH 52511)弃用了带有
PeriodIndex
(和 'convention' 关键字)的Series.resample()
和DataFrame.resample()
,请改在重采样前将其转换为DatetimeIndex
(使用.to_timestamp()
)(GH 53481)弃用了
Series.view()
,请改用Series.astype()
更改数据类型(GH 20251)弃用了
offsets.Tick.is_anchored()
,请改用False
(GH 55388)弃用了
core.internals
成员Block
、ExtensionBlock
和DatetimeTZBlock
,请改用公共 API(GH 55139)弃用了
PeriodIndex
构造函数中的year
、month
、quarter
、day
、hour
、minute
和second
关键字,请改用PeriodIndex.from_fields()
(GH 55960)弃用了在
Index.view()
中接受类型作为参数,请改在不带任何参数的情况下调用(GH 55709)弃用了在
date_range()
、timedelta_range()
、period_range()
和interval_range()
中允许非整数periods
参数(GH 56036)弃用了在
DataFrame.to_clipboard()
中允许非关键字参数(GH 54229)弃用了在
DataFrame.to_csv()
中允许非关键字参数,但path_or_buf
除外(GH 54229)弃用了在
DataFrame.to_dict()
中允许非关键字参数(GH 54229)弃用了在
DataFrame.to_excel()
中允许非关键字参数,但excel_writer
除外(GH 54229)弃用了在
DataFrame.to_gbq()
中允许非关键字参数,但destination_table
除外(GH 54229)弃用了在
DataFrame.to_hdf()
中允许非关键字参数,但path_or_buf
除外(GH 54229)弃用了在
DataFrame.to_html()
中允许非关键字参数,但buf
除外(GH 54229)弃用了在
DataFrame.to_json()
中允许非关键字参数,但path_or_buf
除外(GH 54229)弃用了在
DataFrame.to_latex()
中允许非关键字参数,但buf
除外(GH 54229)弃用了在
DataFrame.to_markdown()
中允许非关键字参数,但buf
除外(GH 54229)弃用了在
DataFrame.to_parquet()
中允许非关键字参数,但path
除外(GH 54229)弃用了在
DataFrame.to_pickle()
中允许非关键字参数,但path
除外(GH 54229)弃用了在
DataFrame.to_string()
中允许非关键字参数,但buf
除外(GH 54229)弃用了在
DataFrame.to_xml()
中允许非关键字参数,但path_or_buffer
除外(GH 54229)弃用了允许将
BlockManager
对象传递给DataFrame
或将SingleBlockManager
对象传递给Series
(GH 52419)弃用了
Index.insert()
在处理 object 数据类型索引时静默对结果执行类型推断的行为,请改显式调用result.infer_objects(copy=False)
以获得旧行为(GH 51363)弃用了在处理
datetime64
、timedelta64
和PeriodDtype
数据类型时,在Series.isin()
和Index.isin()
中强制转换非日期时间值(主要是字符串)的行为(GH 53111)弃用了在将 pandas 输入提供给
Index
、Series
和DataFrame
构造函数时进行数据类型推断的行为,请改在输入上调用.infer_objects
以保留当前行为(GH 56012)弃用了在将
Index
设置到DataFrame
中时进行数据类型推断的行为,请改显式进行类型转换(GH 56102)弃用了在使用
DataFrameGroupBy.apply()
和DataFrameGroupBy.resample()
时将分组包含在计算中的行为;传递include_groups=False
以排除分组(GH 7155)弃用了在按长度为 1 的类列表分组时,不向
DataFrameGroupBy.get_group
或SeriesGroupBy.get_group
传递元组的行为(GH 25971)弃用了在
YearBegin
中表示频率的字符串AS
,以及表示不同财政年度开始的年度频率字符串AS-DEC
、AS-JAN
等(GH 54275)弃用了在
YearEnd
中表示频率的字符串A
,以及表示不同财政年度结束的年度频率字符串A-DEC
、A-JAN
等(GH 54275)弃用了在
BYearBegin
中表示频率的字符串BAS
,以及表示不同财政年度开始的年度频率字符串BAS-DEC
、BAS-JAN
等(GH 54275)弃用了在
BYearEnd
中表示频率的字符串BA
,以及表示不同财政年度结束的年度频率字符串BA-DEC
、BA-JAN
等(GH 54275)弃用了在
Hour
、BusinessHour
、CustomBusinessHour
中表示频率的字符串H
、BH
和CBH
(GH 52536)弃用了在
to_timedelta()
中表示单位的字符串H
、S
、U
和N
(GH 52536)弃用了在
Minute
、Second
、Milli
、Micro
、Nano
中表示频率的字符串T
、S
、L
、U
和N
(GH 52536)弃用了在
read_csv()
中结合解析后的日期时间列以及keep_date_col
关键字的支持 (GH 55569)弃用了
DataFrameGroupBy.grouper
和SeriesGroupBy.grouper
;这些属性将在未来的 pandas 版本中移除 (GH 56521)弃用了
Grouping
的属性group_index
、result_index
和group_arraylike
;这些属性将在未来的 pandas 版本中移除 (GH 56148)弃用了
read_csv()
和read_table()
中的delim_whitespace
关键字,请改用sep="\\s+"
(GH 55569)弃用了
to_datetime()
、to_timedelta()
和to_numeric()
中的errors="ignore"
选项;请改为显式捕获异常 (GH 54467)弃用了
Series.resample()
和DataFrame.resample()
中的kind
关键字,请改为显式转换对象的index
(GH 55895)弃用了
PeriodIndex
中的ordinal
关键字,请改用PeriodIndex.from_ordinals()
(GH 55960)弃用了
TimedeltaIndex
构造函数中的unit
关键字,请改用to_timedelta()
(GH 55499)弃用了
read_csv()
和read_table()
中的verbose
关键字 (GH 55569)弃用了
DataFrame.replace()
和Series.replace()
用于CategoricalDtype
的行为;在未来的版本中,replace 将改变值但保留类别。要改变类别,请改用ser.cat.rename_categories
(GH 55147)弃用了
Series.value_counts()
和Index.value_counts()
用于 object dtype 的行为;在未来的版本中,它们将不再对结果Index
执行 dtype 推断,请执行result.index = result.index.infer_objects()
以保留旧行为 (GH 56161)弃用了
DataFrame.pivot_table()
中observed=False
的默认值;在未来的版本中将是True
(GH 56236)弃用了扩展测试类
BaseNoReduceTests
、BaseBooleanReduceTests
和BaseNumericReduceTests
,请改用BaseReduceTests
(GH 54663)弃用了选项
mode.data_manager
和ArrayManager
;未来的版本中将只提供BlockManager
(GH 55043)弃用了
DataFrame.stack
的先前实现;请指定future_stack=True
以采用未来版本 (GH 53515)
性能改进#
改进了
testing.assert_frame_equal()
和testing.assert_series_equal()
的性能 (GH 55949, GH 55971)改进了
get_dummies()
的性能 (GH 56089)改进了在按已排序的升序键合并时
merge()
和merge_ordered()
的性能 (GH 56115)改进了
merge_asof()
在by
不为None
时的性能 (GH 55580, GH 55678)改进了
read_stata()
读取包含许多变量的文件时的性能 (GH 55515)改进了
DataFrame.groupby()
聚合 pyarrow timestamp 和 duration dtypes 时的性能 (GH 55031)改进了
DataFrame.join()
在按无序分类索引连接时的性能 (GH 56345)改进了使用
MultiIndex
进行索引时DataFrame.loc()
和Series.loc()
的性能 (GH 56062)改进了使用
MultiIndex
作为索引时DataFrame.sort_index()
和Series.sort_index()
的性能 (GH 54835)改进了将 DataFrame 转换为字典时
DataFrame.to_dict()
的性能 (GH 50990)改进了
Index.difference()
的性能 (GH 55108)改进了当索引已排序时
Index.sort_values()
的性能 (GH 56128)改进了
MultiIndex.get_indexer()
在method
不为None
时的性能 (GH 55839)改进了
Series.duplicated()
对于 pyarrow dtypes 的性能 (GH 55255)改进了
Series.str.get_dummies()
在 dtype 为"string[pyarrow]"
或"string[pyarrow_numpy]"
时的性能 (GH 56110)改进了
Series.str()
访问器的方法的性能 (GH 55736)改进了
Series.value_counts()
和Series.mode()
对于 masked dtypes 的性能 (GH 54984, GH 55340)改进了
DataFrameGroupBy.nunique()
和SeriesGroupBy.nunique()
的性能 (GH 55972)改进了
SeriesGroupBy.idxmax()
、SeriesGroupBy.idxmin()
、DataFrameGroupBy.idxmax()
和DataFrameGroupBy.idxmin()
的性能 (GH 54234)改进了对可空扩展数组进行哈希运算时的性能 (GH 56507)
改进了对非唯一索引进行索引时的性能 (GH 55816)
改进了使用超过 4 个键进行索引时的性能 (GH 54550)
改进了将时间本地化到 UTC 时的性能 (GH 55241)
Bug 修复#
Categorical#
修复了当 categorical 包含重叠的
Interval
值时,Categorical.isin()
引发InvalidIndexError
的问题 (GH 34974)修复了
CategoricalDtype.__eq__()
对于包含混合类型的无序 categorical 数据返回False
的 bug (GH 55468)修复了使用
pa.DictionaryArray
作为类别将pa.dictionary
强制转换为CategoricalDtype
时出现的 bug (GH 56672)
日期时间相关 (Datetimelike)#
修复了构建
DatetimeIndex
时,同时传递tz
和dayfirst
或yearfirst
但忽略 dayfirst/yearfirst 的 bug (GH 55813)修复了向
DatetimeIndex
传递包含 float 对象的 object-dtype ndarray 和tz
时,错误地本地化结果的 bug (GH 55780)修复了
Series.isin()
对于DatetimeTZDtype
dtype 且比较值全部为NaT
时,即使 series 包含NaT
条目也错误地返回全False
的 bug (GH 56427)修复了
concat()
在连接全 NA 的 DataFrame 和DatetimeTZDtype
dtype 的 DataFrame 时引发AttributeError
的 bug (GH 52093)修复了
testing.assert_extension_array_equal()
在比较分辨率时可能使用错误单位的 bug (GH 55730)修复了
to_datetime()
和DatetimeIndex
在传递包含混合字符串和数字类型的列表时错误地引发异常的 bug (GH 55780)修复了
to_datetime()
和DatetimeIndex
在传递具有混合时区或混合时区感知性的混合类型对象时未能引发ValueError
的 bug (GH 55693)修复了
Tick.delta()
对于非常大的 ticks 引发OverflowError
而不是OutOfBoundsTimedelta
的 bug (GH 55503)修复了
DatetimeIndex.shift()
对于非纳秒分辨率错误地返回纳秒分辨率结果的 bug (GH 56117)修复了
DatetimeIndex.union()
对于具有相同时区但不同单位的时区感知索引返回 object dtype 的 bug (GH 55238)修复了当索引中第一个值为
NaT
时,Index.is_monotonic_increasing()
和Index.is_monotonic_decreasing()
总是将Index.is_unique()
缓存为True
的 bug (GH 55755)修复了
Index.view()
转换为具有不支持分辨率的 datetime64 dtype 时错误地引发异常的 bug (GH 55710)修复了
Series.dt.round()
对于非纳秒分辨率且包含NaT
条目时错误地引发OverflowError
的 bug (GH 56158)修复了
Series.fillna()
对于非纳秒分辨率 dtypes 和更高分辨率向量值返回错误(内部损坏)结果的 bug (GH 56410)修复了
Timestamp.unit()
从具有分钟或小时分辨率及有时区偏移的 ISO8601 格式字符串错误推断的 bug (GH 56208)修复了
.astype
从更高分辨率的datetime64
dtype 转换为较低分辨率的datetime64
dtype(例如datetime64[us]->datetime64[ms]
)时,在接近下限值时静默溢出的 bug (GH 55979)修复了对具有非纳秒分辨率的
datetime64
Series
、Index
或DataFrame
列添加或减去Week
offset 时返回错误结果的 bug (GH 55583)修复了对非纳秒
Index
、Series
或DataFrame
列添加或减去带有offset
属性的BusinessDay
offset 时给出错误结果的 bug (GH 55608)修复了对具有非纳秒分辨率的
datetime64
Index
、Series
或DataFrame
列添加或减去带有微秒部分的DateOffset
对象时出现的 bug (GH 55595)修复了对
Timestamp
或Timedelta
对象添加或减去非常大的Tick
对象时引发OverflowError
而不是OutOfBoundsTimedelta
的 bug (GH 55503)修复了使用非纳秒
DatetimeTZDtype
和在纳秒分辨率下会超出范围的输入创建Index
、Series
或DataFrame
时错误地引发OutOfBoundsDatetime
的 bug (GH 54620)修复了使用混合数字输入创建带有非纳秒
datetime64
(或DatetimeTZDtype
)的Index
、Series
或DataFrame
时,将其视为纳秒而不是 dtype 单位的倍数(非混合数字输入会发生这种情况)的 bug (GH 56004)修复了使用非纳秒
datetime64
dtype 和对于datetime64[ns]
会超出范围的输入创建Index
、Series
或DataFrame
时错误地引发OutOfBoundsDatetime
的 bug (GH 55756)修复了使用非 ISO8601 格式解析带有纳秒分辨率的日期时间字符串时,错误地截断亚微秒部分的 bug (GH 56051)
修复了解析带有亚秒分辨率和尾随零的日期时间字符串时,错误地推断为秒或毫秒分辨率的 bug (GH 55737)
修复了
to_datetime()
使用浮点 dtype 参数且unit
与Timestamp
的逐点结果不匹配时,结果不正确的 bug (GH 56037)
Timedelta#
在使用
Timedelta
构造时,引发OverflowError
而不是OutOfBoundsTimedelta
的错误 (GH 55503)在渲染 (
__repr__
) 具有 timedelta64 值(非纳秒分辨率,且所有条目都是 24 小时的倍数)的TimedeltaIndex
和Series
时,未能使用纳秒情况下的紧凑表示形式的错误 (GH 55405)
时区#
在
AbstractHolidayCalendar
中,计算节假日时时区数据未被传播的错误 (GH 54580)使用模糊值和
pytz
时区构建Timestamp
时,未能引发pytz.AmbiguousTimeError
的错误 (GH 55657)在夏令时期间,使用
nonexistent="shift_forward
对 UTC+0 附近的Timestamp.tz_localize()
进行本地化时出现的错误 (GH 51501)
数值#
使用
engine="pyarrow"
调用read_csv()
时,导致大整数出现舍入错误的错误 (GH 52505)使用整数 dtype 的
ArrowDtype
调用Series.__floordiv__()
和Series.__truediv__()
时,对于大除数引发异常的错误 (GH 56706)使用整数 dtype 的
ArrowDtype
调用Series.__floordiv__()
时,对于大数值引发异常的错误 (GH 56645)使用
Series.pow()
时,未正确填充缺失值的错误 (GH 55512)使用
Series.replace()
和DataFrame.replace()
时,将浮点数0.0
与False
互换匹配的错误 (GH 55398)使用
Series.round()
时,对可空布尔 dtype 引发异常的错误 (GH 55936)
转换#
在未反序列化的数组上使用
str
调用DataFrame.astype()
时,数组可能发生原地修改的错误 (GH 54654)在
DataFrame.astype()
中,对扩展类型指定errors="ignore"
无效的错误 (GH 54654)使用
Series.convert_dtypes()
时,未能将所有 NA 列转换为null[pyarrow]
的错误 (GH 55346)使用完整列赋值(例如
df.loc[:, 'a'] = incompatible_value
)将具有不同 dtype 的Series
赋值时,:meth:DataFrame.loc
未抛出“不兼容 dtype 警告”(参见 PDEP6)的错误 (GH 39584)
字符串#
在检查没有元素的 object 数组是否为字符串 dtype 时,
pandas.api.types.is_string_dtype()
中出现的错误 (GH 54661)当指定
engine="numba"
且列或索引具有StringDtype
时,DataFrame.apply()
失败的错误 (GH 56189)使用
DataFrame.reindex()
时,未能匹配具有string[pyarrow_numpy]
dtype 的Index
的错误 (GH 56106)Index.str.cat()
总是将结果转换为 object dtype 的错误 (GH 56157)使用
pyarrow.string
dtype 的ArrowDtype
以及 pyarrow 后端使用string[pyarrow]
时,Series.__mul__()
中出现的错误 (GH 51970)当
start < 0
且使用pyarrow.string
的ArrowDtype
时,Series.str.find()
中出现的错误 (GH 56411)当
dtype=pandas.ArrowDtype(pyarrow.string()))
时,如果正则表达式以字面量 //$ 结尾,Series.str.fullmatch()
允许部分匹配的错误 (GH 56652)当
n < 0
且使用pyarrow.string
的ArrowDtype
时,Series.str.replace()
中出现的错误 (GH 56404)当参数类型为
tuple[str, ...]
且使用pyarrow.string
dtype 的ArrowDtype
时,Series.str.startswith()
和Series.str.endswith()
中出现的错误 (GH 56579)当参数类型为
tuple[str, ...]
且使用string[pyarrow]
时,Series.str.startswith()
和Series.str.endswith()
中出现的错误 (GH 54942)对
dtype="string[pyarrow_numpy]"
进行比较操作时,如果 dtype 不可比较,会引发异常的错误 (GH 56008)
区间#
在
Interval
的__repr__
中,未能显示Timestamp
边界的 UTC 偏移量的错误。此外,现在会显示小时、分钟和秒 components (GH 55015)对包含 datetime64 或 timedelta64 区间的
IntervalDtype
调用IntervalIndex.factorize()
和Series.factorize()
时,未能保留非纳秒单位的错误 (GH 56099)将分辨率不匹配的
datetime64
或timedelta64
数组传递给IntervalIndex.from_arrays()
时,构造了无效的IntervalArray
对象的错误 (GH 55714)如果子类型是可空扩展 dtype,
IntervalIndex.from_tuples()
会引发异常的错误 (GH 56765)使用 datetime 或 timedelta 区间调用
IntervalIndex.get_indexer()
时,错误地匹配到整数目标的错误 (GH 47772)使用带时区的 datetime 区间调用
IntervalIndex.get_indexer()
时,错误地匹配到一系列不带时区的目标的错误 (GH 47772)使用切片为具有
IntervalIndex
的Series
设置值时,错误地引发异常的错误 (GH 54722)
索引#
当
DataFrame
具有MultiIndex
时,DataFrame.loc()
会修改布尔索引器的错误 (GH 56635)将具有扩展 dtype 的
Series
设置到 NumPy dtype 时,DataFrame.loc()
中出现的错误 (GH 55604)当
other
为空或other
被视为不可比较时,Index.difference()
未返回唯一值集的错误 (GH 55113)将
Categorical
值设置到具有 numpy dtype 的DataFrame
时,引发RecursionError
的错误 (GH 52927)修复了使用单个字符串值创建具有缺失值的新列时的错误 (GH 56204)
缺失值#
使用
DataFrame.update()
时,对带时区的 datetime64 dtypes 未进行原地更新的错误 (GH 56227)
MultiIndex#
当提供了
method
且索引非单调时,MultiIndex.get_indexer()
未引发ValueError
的错误 (GH 53452)
I/O#
使用
read_csv()
时,当指定了skiprows
参数,engine="python"
未遵守chunksize
参数的错误 (GH 56323)使用
read_csv()
时,当指定了可调用skiprows
和块大小时,engine="python"
导致TypeError
的错误 (GH 55677)使用
read_csv()
时,on_bad_lines="warn"
会写入到stderr
而非引发 Python 警告的错误;现在这会产生一个errors.ParserWarning
(GH 54296)使用
engine="pyarrow"
调用read_csv()
时,quotechar
被忽略的错误 (GH 52266)使用
engine="pyarrow"
调用read_csv()
时,对于没有头部的 CSV 文件,usecols
无效的错误 (GH 54459)使用
engine="xlrd"
(xls
文件)调用read_excel()
时,当文件包含NaN
或Inf
时出错的错误 (GH 54564)如果设置了
infer_string
,read_json()
未正确处理 dtype 转换的错误 (GH 56195)使用
DataFrame.to_excel()
和OdsWriter
(ods
文件)时,写入布尔/字符串值的错误 (GH 54994)使用非纳秒分辨率的
datetime64
dtypes 调用DataFrame.to_hdf()
和read_hdf()
时,未能正确往返转换的错误 (GH 55622)使用
DataFrame.to_stata()
时,对扩展 dtypes 引发异常的错误 (GH 54671)使用
engine="odf"
(ods
文件)调用read_excel()
时,当字符串单元格包含批注时出现的错误 (GH 55200)使用不包含浮点值缓存格式化单元格的 ODS 文件调用
read_excel()
时出现的错误 (GH 55219)使用
DataFrame.to_json()
时,对于不支持的 NumPy 类型,会引发OverflowError
而不是TypeError
的错误 (GH 55403)
周期#
构建
PeriodIndex
时,当传递了data
、ordinal
和**fields
中的多个参数,却未能引发ValueError
的错误 (GH 55961)使用
Period
进行加法运算时,悄无声息地发生环绕而非引发OverflowError
的错误 (GH 55503)使用
astype
将PeriodDtype
转换为非纳秒单位的datetime64
或DatetimeTZDtype
时,错误地返回纳秒单位的错误 (GH 55958)
绘图#
使用
vert=False
调用DataFrame.plot.box()
,且 MatplotlibAxes
是用sharey=True
创建时出现的错误 (GH 54941)DataFrame.plot.scatter()
丢弃字符串列的错误 (GH 56142)重复使用
ax
对象调用Series.plot()
时,如果传递了how
关键字,未能引发异常的错误 (GH 55953)
分组/重采样/滚动计算#
当索引是包含 NA 值的
CategoricalIndex
时,DataFrameGroupBy.idxmin()
、DataFrameGroupBy.idxmax()
、SeriesGroupBy.idxmin()
和SeriesGroupBy.idxmax()
未保留Categorical
dtype 的错误 (GH 54234)当
observed=False
且f="idxmin"
或f="idxmax"
时,DataFrameGroupBy.transform()
和SeriesGroupBy.transform()
对未观察到的类别错误地引发异常的错误 (GH 54234)当 DataFrame 的列或 Series 的名称是整数时,
DataFrameGroupBy.value_counts()
和SeriesGroupBy.value_counts()
可能导致排序不正确的错误 (GH 55951)DataFrameGroupBy.value_counts()
和SeriesGroupBy.value_counts()
未遵守DataFrame.groupby()
和Series.groupby()
中的sort=False
参数的错误 (GH 55951)当
sort=True
和normalize=True
时,DataFrameGroupBy.value_counts()
和SeriesGroupBy.value_counts()
按比例而非频率排序的错误 (GH 55951)对具有非纳秒分辨率的
DatetimeIndex
调用DataFrame.asfreq()
和Series.asfreq()
时,错误地转换为纳秒分辨率的错误 (GH 55958)当传递具有非纳秒
datetime64
或DatetimeTZDtype
dtype 的times
参数时,DataFrame.ewm()
中出现的错误 (GH 56262)在使用
DataFrame.groupby()
和Series.groupby()
时,当sort=True
且按Decimal
和 NA 值的组合进行分组时会失败的错误 (GH 54847)对 DataFrame 子类调用
DataFrame.groupby()
时,当选择列子集应用函数时出现的错误 (GH 56761)DataFrame.resample()
中的 bug,对于BusinessDay
不遵循closed
和label
参数 (GH 55282)DataFrame.resample()
中的 bug,当对pyarrow.timestamp
或pyarrow.duration
类型的ArrowDtype
进行重采样时 (GH 55989)DataFrame.resample()
中的 bug,其中BusinessDay
的 bin 边缘不正确 (GH 55281)DataFrame.resample()
中的 bug,其中MonthBegin
的 bin 边缘不正确 (GH 55271)DataFrame.rolling()
和Series.rolling()
中的 bug,其中重复的日期时间索引在使用closed='left'
和closed='neither'
时被视为连续而非相等 (GH 20712)DataFrame.rolling()
和Series.rolling()
中的 bug,其中index
或on
列是带有pyarrow.timestamp
类型的ArrowDtype
(GH 55849)
重塑#
concat()
中的 bug,当传递DatetimeIndex
索引时忽略sort
参数 (GH 54769)merge_asof()
中的 bug,当by
的 dtype 不是object
、int64
或uint64
时引发TypeError
(GH 22794)merge_asof()
中的 bug,对字符串 dtype 引发不正确的错误 (GH 56444)merge_asof()
中的 bug,当对ArrowDtype
列使用Timedelta
容差时 (GH 56486)DataFrame.melt()
中的 bug,如果var_name
不是字符串则引发异常 (GH 55948)DataFrame.melt()
中的 bug,它不会保留 datetime (GH 55254)DataFrame.pivot_table()
中的 bug,当列具有数字名称时行边距不正确 (GH 26568)DataFrame.pivot()
中的 bug,使用数字列和数据的 extension dtype 时 (GH 56528)DataFrame.stack()
中的 bug,使用future_stack=True
时不会保留索引中的 NA 值 (GH 56573)
稀疏#
arrays.SparseArray.take()
中的 bug,使用与数组填充值不同的填充值时 (GH 55181)
其他#
DataFrame.__dataframe__()
不支持 pyarrow large strings (GH 56702)DataFrame.describe()
中的 bug,在格式化百分位数时,结果中的 99.999% 百分位数被四舍五入到 100% (GH 55765)api.interchange.from_dataframe()
中的 bug,在处理空字符串列时引发NotImplementedError
(GH 56703)cut()
和qcut()
中的 bug,其中datetime64
dtype 值(非纳秒单位)错误地返回纳秒单位的 bin (GH 56101)cut()
中的 bug,错误地允许使用时区无关的 bin 对时区感知的 datetime 进行切割 (GH 54964)infer_freq()
和DatetimeIndex.inferred_freq()
中的 bug,使用每周频率和非纳秒分辨率时 (GH 55609)DataFrame.apply()
中的 bug,其中传递raw=True
会忽略传递给应用函数的args
参数 (GH 55009)DataFrame.from_dict()
中的 bug,它总是对创建的DataFrame
的行进行排序。(GH 55683)DataFrame.sort_index()
中的 bug,当传递axis="columns"
和ignore_index=True
时引发ValueError
(GH 56478)渲染带有
MultiIndex
的Series
时的 bug,其中一个索引级别的名称为 0 时未显示该名称 (GH 55415)将时间格式字符串转换为
ArrowDtype
且类型为pyarrow.time64
时出现的 bug (GH 56463)修复了
numba
>= 0.58.0 在core.window.Rolling.apply
中使用engine="numba"
传递 numpy ufunc 时发出的虚假弃用警告 (GH 55247)
贡献者#
本次发布共有 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 +