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

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

增强功能#

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

PyArrow 将成为 pandas 3.0 及更高版本的必需依赖项。此决定基于 PDEP 10

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

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

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

  • 与其他依赖 Apache Arrow 的库更好地互操作。

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

默认避免对字符串使用 NumPy object 数据类型#

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

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

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

pd.options.future.infer_string = True

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

DataFrame 聚合操作保留扩展数据类型#

在 pandas 的早期版本中,DataFrame 聚合操作(DataFrame.sum() DataFrame.mean() 等)的结果是 NumPy 数据类型,即使 DataFrame 具有扩展数据类型。现在,当对具有相同数据类型的 DataFrame 列执行聚合操作时,Pandas 可以保留其数据类型 (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]

请注意,数据类型现在分别是掩码数据类型和 PyArrow 数据类型,而以前是 NumPy 整数数据类型。

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

写时复制改进#

  • Series.transform()func 就地修改 Series 时现在遵守写时复制原则 (GH 53747)

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

  • Series 设置到 DataFrame 中现在会创建延迟复制而非深层复制 (GH 53142)

  • DataFrame 构造函数,当从 Index 对象的字典构造 DataFrame 并指定 copy=False 时,现在将对这些 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)

  • 尝试在临时列选择上就地操作(例如,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() 相同的功能,但新名称更好地传达了这是 DataFrame 版本的 Series.map() (GH 52353)。

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

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

na_action="ignore" 现在适用于所有数组类型 (GH 52219, GH 51645, GH 51809, GH 51936, GH 52033; GH 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"。此行为已被弃用,Categorical.map() 的默认值将改为 na_action=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 值,但在处理过程中仍会将数据类型强制转换为 float64。在新版本中,不会引入任何 NA 值,因此也没有数据类型的强制转换。

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,其附加的 dtype 名称已从 PandasDtype 更改为 NumpyEADtype;导入 PandasArray 在下一个主要版本之前仍然有效 (GH 53694)

弃用#

弃用 setitem 类的 Series 操作中的隐式向上转型#

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

在 Series(或 DataFrame 列)上执行的 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 是一个 DataFrameindexer 可以是切片、掩码、单个值、值列表或数组,或任何其他允许的索引器。

在未来的版本中,这些操作将引发错误,您应该首先转换为一个共同的数据类型。

旧行为:

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 数据类型:

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

根据用例,转换为不同的数据类型可能更合适。例如,在以下示例中,我们转换为 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 类型的 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

其他弃用#

性能改进#

错误修复#

类别型#

日期时间类型#

  • 带有 na_action="ignore"DatetimeIndex.map() 现在按预期工作 (GH 51644)

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

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

  • date_range() 中修复了一个错误,当 freq 是带有 nanosecondsDateOffset 时 (GH 46877)

  • to_datetime() 修复了一个错误,该错误在将包含 PyArrow 时间戳的 SeriesDataFramearrays.ArrowExtensionArray 转换为 NumPy datetime 时出现 (GH 52545)

  • DatetimeArray.map()DatetimeIndex.map() 中修复了一个错误,该错误导致提供的可调用对象以数组方式而非元素方式操作 (GH 51977)

  • DataFrame.to_sql() 中修复了一个错误,该错误在 PyArrow 支持的日期类数据类型时引发 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)

  • 解析包含工作日但没有日期(例如“2023 Sept Thu”)的日期时间字符串时修复了一个错误,该错误错误地引发 AttributeError 而不是 ValueError (GH 52659)

  • 当数据类型是具有非纳秒分辨率的时区感知 datetime 时,Series 的 repr 中修复了一个错误,该错误引发 OutOfBoundsDatetime (GH 54623)

时间差#

  • TimedeltaIndex 除法或乘法导致 .freq 为“0 天”而不是 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)

  • 带有 na_action="ignore"TimedeltaIndex.map() 修复了一个错误 (GH 51644)

  • arrays.TimedeltaArray.map()TimedeltaIndex.map() 中修复了一个错误,该错误导致提供的可调用对象以数组方式而非元素方式操作 (GH 51977)

时区#

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

  • DatetimeTZDtype.base() 中修复了一个错误,该错误始终返回具有纳秒分辨率的 NumPy 数据类型 (GH 52705)

数值型#

转换#

  • DataFrame.style.to_latex()DataFrame.style.to_html() 中修复了一个错误,如果 DataFrame 包含的整数位数超过浮点双精度所能表示的位数 (GH 52272)

  • array() 修复了一个错误,该错误在给定单位为“s”、“us”或“ms”的 datetime64timedelta64 数据类型时返回 NumpyExtensionArray 而不是 DatetimeArrayTimedeltaArray (GH 52859)

  • array() 修复了一个错误,该错误在给定空列表且无数据类型时返回 NumpyExtensionArray 而不是 FloatingArray (GH 54371)

  • ArrowDtype.numpy_dtype() 修复了一个错误,该错误会针对非纳秒 pyarrow.timestamppyarrow.duration 类型返回纳秒单位 (GH 51800)

  • DataFrame.__repr__() 修复了一个错误,该错误在列的数据类型为 np.record 时错误地引发了 TypeError (GH 48526)

  • DataFrame.info() 修复了一个错误,该错误在设置 use_numba 时引发 ValueError (GH 51922)

  • DataFrame.insert() 修复了一个错误,如果 locnp.int64 则引发 TypeError (GH 53193)

  • HDFStore.select() 修复了一个错误,该错误在存储和检索大整数时会丢失精度 (GH 54186)

  • Series.astype() 不支持 object_ 的错误已修复 (GH 54251)

字符串#

  • Series.str() 中修复了一个错误,该错误在迭代时未引发 TypeError (GH 54173)

  • 带有字符串数据类型列的 DataFrame`repr 修复了一个错误 (GH 54797)

区间#

索引#

  • DataFrame.__setitem__() 修复了一个错误,该错误在将 DataFrame 设置到重复列时会丢失数据类型 (GH 53143)

  • DataFrame.__setitem__() 带有布尔掩码和 DataFrame.putmask() 带有混合非数值数据类型和除了 NaN 以外的值时修复了一个错误,该错误错误地引发了 TypeError (GH 53291)

  • DataFrame.iloc() 修复了一个错误,该错误在使用 nan 作为唯一元素时出现 (GH 52234)

  • Series.loc() 修复了一个错误,该错误在对象数据类型 Series 的预定义索引处分配 Series 时将 Series 转换为 np.dnarray (GH 48933)

缺失值#

MultiIndex#

输入/输出#

  • DataFrame.to_orc() 现在在给定非默认 Index 时引发 ValueError (GH 51828)

  • DataFrame.to_sql() 现在在使用 SQLAlchemy 连接时,如果 name 参数留空则引发 ValueError (GH 52675)

  • json_normalize() 无法解析元数据字段列表类型的错误已修复 (GH 37782)

  • read_csv() 中修复了一个错误,该错误在 parse_dates 设置为列表或字典且 engine="pyarrow" 时会出错 (GH 47961)

  • read_csv() 带有 engine="pyarrow" 时,在指定 dtypeindex_col 时引发错误的错误已修复 (GH 53229)

  • read_hdf() 修复了一个错误,该错误在引发 IndexError 后未正确关闭存储 (GH 52781)

  • read_html() 修复了一个错误,该错误导致样式元素被读取到 DataFrames 中 (GH 52197)

  • read_html() 修复了一个错误,该错误导致尾部文本与包含 display:none 样式的元素一起被移除 (GH 51629)

  • read_sql_table() 修复了一个错误,该错误在读取视图时引发异常 (GH 52969)

  • read_sql() 修复了一个错误,该错误在读取具有相同列名的多个时区感知列时出现 (GH 44421)

  • read_xml() 修复了一个错误,该错误剥离了字符串数据中的空格 (GH 53811)

  • DataFrame.to_html() 修复了一个错误,该错误在多索引列的情况下错误地应用了 colspace (GH 53885)

  • DataFrame.to_html() 修复了一个错误,该错误导致具有复杂数据类型的空 DataFrame 转换时引发了 ValueError (GH 54167)

  • DataFrame.to_json() 修复了一个错误,该错误导致具有非纳秒精度的 DateTimeArray/DateTimeIndex 无法正确序列化 (GH 53686)

  • 写入和读取空 Stata dta 文件时丢失数据类型信息的错误已修复 (GH 46240)

  • bz2 被视为硬性要求的错误已修复 (GH 53857)

周期#

  • 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 数据类型列而不是 float64 数据类型列 (GH 52087)

  • Period.now() 修复了一个错误,该错误不接受 freq 参数作为关键字参数 (GH 53369)

  • 带有 na_action="ignore"PeriodIndex.map() 修复了一个错误 (GH 51644)

  • arrays.PeriodArray.map()PeriodIndex.map() 中修复了一个错误,该错误导致提供的可调用对象以数组方式而非元素方式操作 (GH 51977)

  • 修复了一个错误,该错误错误地允许使用 CustomBusinessDay 频率构造 PeriodPeriodDtype;请改用 BusinessDay (GH 52534)

绘图#

分组/重采样/滚动#

重塑#

稀疏#

  • SparseDtype 构造函数中,当为其子类型给定不兼容的 dtype(必须是 NumPy dtype)时未能引发 TypeError 的错误 (GH 53160)

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

扩展数组#

  • ArrowStringArray 构造函数中,对于字符串的字典类型引发 ValueError 的错误 (GH 54074)

  • DataFrame 构造函数中,当在字典中给定具有扩展数据类型(extension dtype)的 Series 时未复制的错误 (GH 53744)

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

  • Series.quantile() 中,对于 PyArrow 时间类型引发 ArrowInvalid 的错误 (GH 52678)

  • Series.rank() 中,对于 Float64 数据类型的小值返回错误顺序的错误 (GH 52471)

  • Series.unique() 中,对于包含 NA 值的布尔 ArrowDtype 返回不正确唯一值的错误 (GH 54667)

  • __iter__()__getitem__() 中,对于非纳秒数据类型(non-nano dtypes)返回 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)

  • 掩码扩展数据类型(masked ExtensionDtypes)(例如 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 +

  • 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 +