1.5.0 版本有什么新特性 (2022 年 9 月 19 日)#
以下是 pandas 1.5.0 的更改。有关包括其他 pandas 版本的完整更改日志,请参阅发布说明。
增强功能#
pandas-stubs
#
由 pandas 开发团队支持的 pandas-stubs
库现已提供,它为 pandas API 提供了类型存根。请访问 pandas-dev/pandas-stubs 了解更多信息。
感谢 VirtusLab 和 Microsoft 对 pandas-stubs
做出的初步且重要的贡献。
原生 PyArrow 支持的 ExtensionArray#
安装 Pyarrow 后,用户现在可以创建由 pyarrow.ChunkedArray
和 pyarrow.DataType
支持的 pandas 对象。
dtype
参数可以接受一个 pyarrow 数据类型的字符串,并在方括号中包含 pyarrow
,例如 "int64[pyarrow]"
,或者对于带有参数的 pyarrow 数据类型,可以接受用 pyarrow.DataType
初始化的 ArrowDtype
。
In [1]: import pyarrow as pa
In [2]: ser_float = pd.Series([1.0, 2.0, None], dtype="float32[pyarrow]")
In [3]: ser_float
Out[3]:
0 1.0
1 2.0
2 <NA>
dtype: float[pyarrow]
In [4]: list_of_int_type = pd.ArrowDtype(pa.list_(pa.int64()))
In [5]: ser_list = pd.Series([[1, 2], [3, None]], dtype=list_of_int_type)
In [6]: ser_list
Out[6]:
0 [1. 2.]
1 [ 3. nan]
dtype: list<item: int64>[pyarrow]
In [7]: ser_list.take([1, 0])
Out[7]:
1 [ 3. nan]
0 [1. 2.]
dtype: list<item: int64>[pyarrow]
In [8]: ser_float * 5
Out[8]:
0 5.0
1 10.0
2 <NA>
dtype: float[pyarrow]
In [9]: ser_float.mean()
Out[9]: 1.5
In [10]: ser_float.dropna()
Out[10]:
0 1.0
1 2.0
dtype: float[pyarrow]
大多数操作都受支持,并已使用 pyarrow compute 函数实现。我们建议安装最新版本的 PyArrow 以使用最近实现的计算函数。
警告
此功能是实验性的,其 API 在未来的版本中可能会在没有警告的情况下更改。
DataFrame 交换协议实现#
Pandas 现在实现了 DataFrame 交换 API 规范。请访问 https://data-apis.org/dataframe-protocol/latest/index.html 查看 API 的完整详情。
该协议包含两部分
新方法
DataFrame.__dataframe__()
,它生成交换对象。它有效地将 pandas DataFrame“导出”为一个交换对象,以便任何实现了该协议的其他库都可以“导入”该 DataFrame,而无需了解生产者除了它能生成交换对象之外的任何信息。新函数
pandas.api.interchange.from_dataframe()
,它可以接受来自任何符合协议的库的任意交换对象,并从中构建一个 pandas DataFrame。
Styler#
最值得注意的开发是新方法 Styler.concat()
,它允许添加自定义页脚行以可视化数据的附加计算,例如总计和计数等(GH 43875, GH 46186)。
此外,还提供了一种替代输出方法 Styler.to_string()
,它允许使用 Styler 的格式化方法创建例如 CSV 文件(GH 44502)。
新功能 Styler.relabel_index()
也已可用,它提供了对索引或列标题显示进行完全自定义的能力(GH 47864)。
次要功能改进包括
增加了在 Excel 中渲染
border
和border-{side}
CSS 属性的能力(GH 42276)。使关键字参数一致:
Styler.highlight_null()
现在接受color
并弃用null_color
,但这仍然向后兼容(GH 45907)。
使用 group_keys
控制 DataFrame.resample()
中的索引#
参数 group_keys
已添加到方法 DataFrame.resample()
。与 DataFrame.groupby()
一样,此参数控制在使用 Resampler.apply()
时是否将每个组添加到重采样(resample)的索引中。
警告
不指定 group_keys
参数将保留之前的行为,并在指定 group_keys=False
会改变结果时发出警告。在未来的 pandas 版本中,不指定 group_keys
将默认采用与 group_keys=False
相同的行为。
In [11]: df = pd.DataFrame(
....: {'a': range(6)},
....: index=pd.date_range("2021-01-01", periods=6, freq="8H")
....: )
....:
In [12]: df.resample("D", group_keys=True).apply(lambda x: x)
Out[12]:
a
2021-01-01 2021-01-01 00:00:00 0
2021-01-01 08:00:00 1
2021-01-01 16:00:00 2
2021-01-02 2021-01-02 00:00:00 3
2021-01-02 08:00:00 4
2021-01-02 16:00:00 5
In [13]: df.resample("D", group_keys=False).apply(lambda x: x)
Out[13]:
a
2021-01-01 00:00:00 0
2021-01-01 08:00:00 1
2021-01-01 16:00:00 2
2021-01-02 00:00:00 3
2021-01-02 08:00:00 4
2021-01-02 16:00:00 5
以前,结果索引会取决于 apply
返回的值,如下例所示。
In [1]: # pandas 1.3
In [2]: df.resample("D").apply(lambda x: x)
Out[2]:
a
2021-01-01 00:00:00 0
2021-01-01 08:00:00 1
2021-01-01 16:00:00 2
2021-01-02 00:00:00 3
2021-01-02 08:00:00 4
2021-01-02 16:00:00 5
In [3]: df.resample("D").apply(lambda x: x.reset_index())
Out[3]:
index a
2021-01-01 0 2021-01-01 00:00:00 0
1 2021-01-01 08:00:00 1
2 2021-01-01 16:00:00 2
2021-01-02 0 2021-01-02 00:00:00 3
1 2021-01-02 08:00:00 4
2 2021-01-02 16:00:00 5
from_dummies#
添加了新函数 from_dummies()
,用于将虚拟编码(dummy coded)的 DataFrame
转换为分类(categorical)的 DataFrame
。
In [11]: import pandas as pd
In [12]: df = pd.DataFrame({"col1_a": [1, 0, 1], "col1_b": [0, 1, 0],
....: "col2_a": [0, 1, 0], "col2_b": [1, 0, 0],
....: "col2_c": [0, 0, 1]})
....:
In [13]: pd.from_dummies(df, sep="_")
Out[13]:
col1 col2
0 a b
1 b a
2 a c
写入 ORC 文件#
新方法 DataFrame.to_orc()
允许写入 ORC 文件(GH 43864)。
此功能依赖于 pyarrow 库。更多详情,请参阅关于 ORC 的 IO 文档。
警告
由于 pyarrow 出现的一些问题,强烈建议使用 conda 安装 pyarrow。
to_orc()
需要 pyarrow>=7.0.0。有关支持的数据类型(dtypes),请参阅 Arrow 中支持的 ORC 功能。
目前,当 DataFrame 转换为 ORC 文件时,日期时间列中的时区不会被保留。
df = pd.DataFrame(data={"col1": [1, 2], "col2": [3, 4]})
df.to_orc("./out.orc")
直接从 TAR 归档文件中读取#
I/O 方法,如 read_csv()
或 DataFrame.to_json()
,现在允许直接对 TAR 归档文件进行读写(GH 44787)。
df = pd.read_csv("./movement.tar.gz")
# ...
df.to_csv("./out.tar.gz")
这支持 .tar
, .tar.gz
, .tar.bz
和 .tar.xz2
归档文件。使用的压缩方法从文件名推断。如果无法推断压缩方法,请使用 compression
参数
df = pd.read_csv(some_file_obj, compression={"method": "tar", "mode": "r:gz"}) # noqa F821
(mode
是 tarfile.open
的模式之一:https://docs.pythonlang.cn/3/library/tarfile.html#tarfile.open)
read_xml 现在支持 dtype
, converters
和 parse_dates
#
与其他的 IO 方法类似,pandas.read_xml()
现在支持为列分配特定的数据类型(dtypes),应用转换方法,以及解析日期(GH 43567)。
In [14]: from io import StringIO
In [15]: xml_dates = """<?xml version='1.0' encoding='utf-8'?>
....: <data>
....: <row>
....: <shape>square</shape>
....: <degrees>00360</degrees>
....: <sides>4.0</sides>
....: <date>2020-01-01</date>
....: </row>
....: <row>
....: <shape>circle</shape>
....: <degrees>00360</degrees>
....: <sides/>
....: <date>2021-01-01</date>
....: </row>
....: <row>
....: <shape>triangle</shape>
....: <degrees>00180</degrees>
....: <sides>3.0</sides>
....: <date>2022-01-01</date>
....: </row>
....: </data>"""
....:
In [16]: df = pd.read_xml(
....: StringIO(xml_dates),
....: dtype={'sides': 'Int64'},
....: converters={'degrees': str},
....: parse_dates=['date']
....: )
....:
In [17]: df
Out[17]:
shape degrees sides date
0 square 00360 4 2020-01-01
1 circle 00360 <NA> 2021-01-01
2 triangle 00180 3 2022-01-01
In [18]: df.dtypes
Out[18]:
shape object
degrees object
sides Int64
date datetime64[ns]
dtype: object
read_xml 现在使用 iterparse
支持大型 XML 文件#
对于大小可达数百兆字节到千兆字节的大型 XML 文件,pandas.read_xml()
现在支持使用 lxml 的 iterparse 和 etree 的 iterparse 来解析这些大文件,这些方法是内存高效的,可以在不将整个树加载到内存中的情况下遍历 XML 树并提取特定元素和属性(GH 45442)。
In [1]: df = pd.read_xml(
... "/path/to/downloaded/enwikisource-latest-pages-articles.xml",
... iterparse = {"page": ["title", "ns", "id"]})
... )
df
Out[2]:
title ns id
0 Gettysburg Address 0 21450
1 Main Page 0 42950
2 Declaration by United Nations 0 8435
3 Constitution of the United States of America 0 8435
4 Declaration of Independence (Israel) 0 17858
... ... ... ...
3578760 Page:Black cat 1897 07 v2 n10.pdf/17 104 219649
3578761 Page:Black cat 1897 07 v2 n10.pdf/43 104 219649
3578762 Page:Black cat 1897 07 v2 n10.pdf/44 104 219649
3578763 The History of Tom Jones, a Foundling/Book IX 0 12084291
3578764 Page:Shakespeare of Stratford (1926) Yale.djvu/91 104 21450
[3578765 rows x 3 columns]
写时复制(Copy on Write)#
添加了一个新功能 copy_on_write
(GH 46958)。写时复制确保以任何方式从另一个对象派生的任何 DataFrame 或 Series 始终表现得像一个副本。写时复制禁止更新应用该方法的对象之外的任何其他对象。
可以通过以下方式启用写时复制
pd.set_option("mode.copy_on_write", True)
pd.options.mode.copy_on_write = True
或者,可以通过以下方式在本地启用写时复制
with pd.option_context("mode.copy_on_write", True):
...
不启用写时复制时,当更新一个从父 DataFrame
派生的子 DataFrame
时,父 DataFrame
会被更新。
In [19]: df = pd.DataFrame({"foo": [1, 2, 3], "bar": 1})
In [20]: view = df["foo"]
In [21]: view.iloc[0]
Out[21]: 1
In [22]: df
Out[22]:
foo bar
0 1 1
1 2 1
2 3 1
启用写时复制后,df 将不再被更新
In [23]: with pd.option_context("mode.copy_on_write", True):
....: df = pd.DataFrame({"foo": [1, 2, 3], "bar": 1})
....: view = df["foo"]
....: view.iloc[0]
....: df
....:
可以在此处找到更详细的解释。
其他增强功能#
Series.map()
现在在arg
是字典但na_action
既不是None
也不是'ignore'
时引发错误(GH 46588)。MultiIndex.to_frame()
现在支持参数allow_duplicates
,并在标签重复时(如果该参数缺失或为 False)引发错误(GH 45245)。StringArray
现在在其构造函数中,除了字符串和pandas.NA
之外,还接受包含 nan 类似值(None
,np.nan
)的 array-likes 作为values
参数(GH 40839)。改进了
CategoricalIndex
中categories 的渲染(GH 45218)。
DataFrame.plot()
现在允许subplots
参数是一个可迭代对象列表,用于指定列组,以便列可以分组到同一子图中(GH 29688)。to_numeric()
现在在向下转型(downcasting)会生成 float32 中无法表示的值时,保留 float64 数组(GH 43693)。Series.reset_index()
和DataFrame.reset_index()
现在支持参数allow_duplicates
(GH 44410)。DataFrameGroupBy.min()
,SeriesGroupBy.min()
,DataFrameGroupBy.max()
和SeriesGroupBy.max()
现在支持使用engine
关键字进行 Numba 执行(GH 45428)。read_csv()
现在支持将defaultdict
作为dtype
参数(GH 41574)。DataFrame.rolling()
和Series.rolling()
现在支持带有固定长度窗口的step
参数(GH 15354)。实现了
bool
数据类型的Index
,将 bool 数据类型的 array-like 传递给pd.Index
现在将保留bool
数据类型,而不是转换为object
(GH 45061)。实现了 complex 数据类型的
Index
,将 complex 数据类型的 array-like 传递给pd.Index
现在将保留 complex 数据类型,而不是转换为object
(GH 45845)。带有
IntegerDtype
的Series
和DataFrame
现在支持按位操作(bitwise operations)(GH 34463)。为
DateOffset
添加了milliseconds
字段支持(GH 43371)。DataFrame.where()
尝试在填充值可以无精度损失地进行类型转换时保持DataFrame
的数据类型(dtype)(GH 45582)。DataFrame.reset_index()
现在接受一个names
参数,用于重命名索引名称(GH 6878)。为
DataFrame.corr()
,DataFrame.corrwith()
,DataFrame.cov()
,DataFrame.idxmin()
,DataFrame.idxmax()
,DataFrameGroupBy.idxmin()
,DataFrameGroupBy.idxmax()
,DataFrameGroupBy.var()
,SeriesGroupBy.var()
,DataFrameGroupBy.std()
,SeriesGroupBy.std()
,DataFrameGroupBy.sem()
,SeriesGroupBy.sem()
和DataFrameGroupBy.quantile()
添加了numeric_only
参数(GH 46560)。当使用
string[pyarrow]
数据类型(dtype)以及未分派给pyarrow.compute
方法的方法时,现在会抛出errors.PerformanceWarning
警告(GH 42613, GH 46725)。为
DataFrame.join()
添加了validate
参数(GH 46622)。为
Resampler.sum()
,Resampler.prod()
,Resampler.min()
,Resampler.max()
,Resampler.first()
和Resampler.last()
添加了numeric_only
参数(GH 46442)。ExponentialMovingWindow
中的times
参数现在接受np.timedelta64
(GH 47003)。DataError
,SpecificationError
,SettingWithCopyError
,SettingWithCopyWarning
,NumExprClobberingError
,UndefinedVariableError
,IndexingError
,PyperclipException
,PyperclipWindowsException
,CSSWarning
,PossibleDataLossError
,ClosedFileError
,IncompatibilityWarning
,AttributeConflictWarning
,DatabaseError
,PossiblePrecisionLoss
,ValueLabelTypeMismatch
,InvalidColumnName
, 和CategoricalConversionWarning
现已在pandas.errors
中公开 (GH 27656)在
testing.assert_series_equal()
中新增了check_like
参数 (GH 47247)为
DataFrameGroupBy.ohlc()
和SeriesGroupBy.ohlc()
新增了对扩展数组 dtype 的支持 (GH 37493)允许使用
read_sas()
读取压缩的 SAS 文件 (例如,.sas7bdat.gz
文件)pandas.read_html()
现已支持从表格单元格中提取链接 (GH 13141)DatetimeIndex.astype()
现已支持将时区无关的索引转换为datetime64[s]
、datetime64[ms]
和datetime64[us]
,并将时区感知的索引转换为相应的datetime64[unit, tzname]
dtype (GH 47579)Series
聚合器(例如min
、max
、sum
、mean
)现在在 dtype 为数字类型且提供了numeric_only=True
时可以成功执行;以前这会引发一个NotImplementedError
(GH 47500)RangeIndex.union()
现在可以在结果值等间隔时返回RangeIndex
而非Int64Index
(GH 47557, GH 43885)DataFrame.compare()
现接受参数result_names
,允许用户指定被比较的左右 DataFrame 的结果名称。默认值为'self'
和'other'
(GH 44354)DataFrame.quantile()
新增了method
参数,可以接受table
来评估多列分位数 (GH 43881)在
Series.set_axis()
和DataFrame.set_axis()
中新增了copy
关键字,允许用户在一个新对象上设置轴,而无需复制底层数据 (GH 47932)方法
ExtensionArray.factorize()
接受use_na_sentinel=False
参数,用于确定如何处理 null 值 (GH 46601)Dockerfile
现在安装了一个专用的pandas-dev
虚拟环境用于 pandas 开发,而不是使用base
环境 (GH 48427)
显著的 bug 修复#
以下是可能导致显著行为变化的 bug 修复。
在分组变换中使用 dropna=True
#
变换是一种其结果与输入大小相同的操作。当结果是 DataFrame
或 Series
时,还要求结果的索引与输入索引匹配。在 pandas 1.4 中,对分组中包含 null 值且设置了 dropna=True
的 DataFrameGroupBy.transform()
或 SeriesGroupBy.transform()
操作会得到错误的结果。如下例所示,错误的结果可能包含不正确的值,或者结果的索引与输入索引不一致。
In [24]: df = pd.DataFrame({'a': [1, 1, np.nan], 'b': [2, 3, 4]})
旧行为:
In [3]: # Value in the last row should be np.nan
df.groupby('a', dropna=True).transform('sum')
Out[3]:
b
0 5
1 5
2 5
In [3]: # Should have one additional row with the value np.nan
df.groupby('a', dropna=True).transform(lambda x: x.sum())
Out[3]:
b
0 5
1 5
In [3]: # The value in the last row is np.nan interpreted as an integer
df.groupby('a', dropna=True).transform('ffill')
Out[3]:
b
0 2
1 3
2 -9223372036854775808
In [3]: # Should have one additional row with the value np.nan
df.groupby('a', dropna=True).transform(lambda x: x)
Out[3]:
b
0 2
1 3
新行为:
In [25]: df.groupby('a', dropna=True).transform('sum')
Out[25]:
b
0 5.0
1 5.0
2 NaN
In [26]: df.groupby('a', dropna=True).transform(lambda x: x.sum())
Out[26]:
b
0 5.0
1 5.0
2 NaN
In [27]: df.groupby('a', dropna=True).transform('ffill')
Out[27]:
b
0 2.0
1 3.0
2 NaN
In [28]: df.groupby('a', dropna=True).transform(lambda x: x)
Out[28]:
b
0 2.0
1 3.0
2 NaN
使用 to_json() 序列化时区无关的 Timestamps 并设置 iso_dates=True
#
DataFrame.to_json()
、Series.to_json()
和 Index.to_json()
会将包含时区无关 Timestamp 的 DatetimeArrays/DatetimeIndexes 错误地本地化为 UTC。 (GH 38760)
请注意,此补丁并未修复序列化时将时区感知 Timestamp 本地化为 UTC 的问题。(相关 issue GH 12997)
旧行为
In [32]: index = pd.date_range(
....: start='2020-12-28 00:00:00',
....: end='2020-12-28 02:00:00',
....: freq='1H',
....: )
....:
In [33]: a = pd.Series(
....: data=range(3),
....: index=index,
....: )
....:
In [4]: from io import StringIO
In [5]: a.to_json(date_format='iso')
Out[5]: '{"2020-12-28T00:00:00.000Z":0,"2020-12-28T01:00:00.000Z":1,"2020-12-28T02:00:00.000Z":2}'
In [6]: pd.read_json(StringIO(a.to_json(date_format='iso')), typ="series").index == a.index
Out[6]: array([False, False, False])
新行为
In [34]: from io import StringIO
In [35]: a.to_json(date_format='iso')
Out[35]: '{"2020-12-28T00:00:00.000Z":0,"2020-12-28T01:00:00.000Z":1,"2020-12-28T02:00:00.000Z":2}'
# Roundtripping now works
In [36]: pd.read_json(StringIO(a.to_json(date_format='iso')), typ="series").index == a.index
Out[36]: array([ True, True, True])
DataFrameGroupBy.value_counts 在使用非分组分类列并设置了 observed=True
时#
调用 DataFrameGroupBy.value_counts()
并设置 observed=True
时,会错误地丢弃非分组列中未被观测到的分类 (GH 46357)。
In [6]: df = pd.DataFrame(["a", "b", "c"], dtype="category").iloc[0:2]
In [7]: df
Out[7]:
0
0 a
1 b
旧行为
In [8]: df.groupby(level=0, observed=True).value_counts()
Out[8]:
0 a 1
1 b 1
dtype: int64
新行为
In [9]: df.groupby(level=0, observed=True).value_counts()
Out[9]:
0 a 1
1 a 0
b 1
0 b 0
c 0
1 c 0
dtype: int64
向后不兼容的 API 变更#
提高了依赖项的最低版本#
一些依赖项的最低支持版本已更新。如果安装,现在需要:
软件包 |
最低版本 |
必须 |
已变更 |
---|---|---|---|
numpy |
1.20.3 |
X |
X |
mypy (dev) |
0.971 |
X |
|
beautifulsoup4 |
4.9.3 |
X |
|
blosc |
1.21.0 |
X |
|
bottleneck |
1.3.2 |
X |
|
fsspec |
2021.07.0 |
X |
|
hypothesis |
6.13.0 |
X |
|
gcsfs |
2021.07.0 |
X |
|
jinja2 |
3.0.0 |
X |
|
lxml |
4.6.3 |
X |
|
numba |
0.53.1 |
X |
|
numexpr |
2.7.3 |
X |
|
openpyxl |
3.0.7 |
X |
|
pandas-gbq |
0.15.0 |
X |
|
psycopg2 |
2.8.6 |
X |
|
pymysql |
1.0.2 |
X |
|
pyreadstat |
1.1.2 |
X |
|
pyxlsb |
1.0.8 |
X |
|
s3fs |
2021.08.0 |
X |
|
scipy |
1.7.1 |
X |
|
sqlalchemy |
1.4.16 |
X |
|
tabulate |
0.8.9 |
X |
|
xarray |
0.19.0 |
X |
|
xlsxwriter |
1.4.3 |
X |
对于 可选库,一般建议使用最新版本。下表列出了 pandas 开发过程中当前正在测试的每个库的最低版本。低于最低测试版本的可选库可能仍然可用,但不被视为受支持的。
软件包 |
最低版本 |
已变更 |
---|---|---|
beautifulsoup4 |
4.9.3 |
X |
blosc |
1.21.0 |
X |
bottleneck |
1.3.2 |
X |
brotlipy |
0.7.0 |
|
fastparquet |
0.4.0 |
|
fsspec |
2021.08.0 |
X |
html5lib |
1.1 |
|
hypothesis |
6.13.0 |
X |
gcsfs |
2021.08.0 |
X |
jinja2 |
3.0.0 |
X |
lxml |
4.6.3 |
X |
matplotlib |
3.3.2 |
|
numba |
0.53.1 |
X |
numexpr |
2.7.3 |
X |
odfpy |
1.4.1 |
|
openpyxl |
3.0.7 |
X |
pandas-gbq |
0.15.0 |
X |
psycopg2 |
2.8.6 |
X |
pyarrow |
1.0.1 |
|
pymysql |
1.0.2 |
X |
pyreadstat |
1.1.2 |
X |
pytables |
3.6.1 |
|
python-snappy |
0.6.0 |
|
pyxlsb |
1.0.8 |
X |
s3fs |
2021.08.0 |
X |
scipy |
1.7.1 |
X |
sqlalchemy |
1.4.16 |
X |
tabulate |
0.8.9 |
X |
tzdata |
2022a |
|
xarray |
0.19.0 |
X |
xlrd |
2.0.1 |
|
xlsxwriter |
1.4.3 |
X |
xlwt |
1.3.0 |
|
zstandard |
0.15.2 |
其他 API 变更#
BigQuery I/O 方法
read_gbq()
和DataFrame.to_gbq()
默认设置为auth_local_webserver = True
。Google 已弃用auth_local_webserver = False
“带外”(复制-粘贴)流程。该auth_local_webserver = False
选项计划于 2022 年 10 月停止工作。 (GH 46312)read_json()
现在在输入是以.json
、.json.gz
、.json.bz2
等结尾的字符串,但文件不存在时,会引发FileNotFoundError
(以前是ValueError
)错误。 (GH 29102)使用
Timestamp
或Timedelta
进行操作时,以前会引发OverflowError
,现在则会根据情况引发OutOfBoundsDatetime
或OutOfBoundsTimedelta
。 (GH 47268)当
read_sas()
以前返回None
时,现在会返回一个空的DataFrame
(GH 47410)
弃用#
警告
在下一个主要版本 2.0 中,正在考虑一些没有正式弃用通知的较大 API 变更,例如将标准库 zoneinfo 作为默认时区实现而非 pytz
,让 Index
支持所有数据类型而不是拥有多个子类(CategoricalIndex
、Int64Index
等),等等。正在考虑的变更已记录在 此 GitHub issue 中,欢迎提出任何反馈或意见。
对拥有 Int64Index 或 RangeIndex 的 Series 进行基于标签的整数切片#
在未来版本中,对拥有 Int64Index
或 RangeIndex
的 Series
进行整数切片将被视为基于标签的,而非基于位置的。这将使行为与其他 Series.__getitem__()
和 Series.__setitem__()
行为保持一致 (GH 45162)。
例如
In [29]: ser = pd.Series([1, 2, 3, 4, 5], index=[2, 3, 5, 7, 11])
在旧行为中,ser[2:4]
将切片视为基于位置的
旧行为:
In [3]: ser[2:4]
Out[3]:
5 3
7 4
dtype: int64
在未来版本中,这将视为基于标签的
未来行为:
In [4]: ser.loc[2:4]
Out[4]:
2 1
3 2
dtype: int64
要保留旧行为,请使用 series.iloc[i:j]
。要获取未来行为,请使用 series.loc[i:j]
。
对 DataFrame
进行切片不会受到影响。
ExcelWriter 属性#
ExcelWriter
的所有属性以前都记录为非公开的。然而,一些第三方 Excel 引擎记录了访问 ExcelWriter.book
或 ExcelWriter.sheets
,并且用户也在使用这些以及可能其他属性。以前这些属性使用不安全;例如,修改 ExcelWriter.book
不会更新 ExcelWriter.sheets
,反之亦然。为了支持这一点,pandas 已经将一些属性公开,并改进了它们的实现,以便现在可以安全地使用它们。 (GH 45572)
以下属性现在是公开的,并被认为是安全访问的。
book
check_extension
close
date_format
datetime_format
engine
if_sheet_exists
sheets
supported_extensions
以下属性已被弃用。现在访问它们时会引发 FutureWarning
警告,并将在未来版本中移除。用户应注意,使用它们被认为是不安全的,可能导致意外结果。
cur_sheet
handles
path
save
write_cells
更多详情请参阅 ExcelWriter
的文档。
在 DataFrameGroupBy.apply() 和 SeriesGroupBy.apply() 中使用 group_keys 及变换器#
在 pandas 以前的版本中,如果推断出传递给 DataFrameGroupBy.apply()
或 SeriesGroupBy.apply()
的函数是变换器(即结果索引与输入索引相同),则会忽略 DataFrame.groupby()
和 Series.groupby()
的 group_keys
参数,并且不会将分组键添加到结果索引中。将来,当用户指定 group_keys=True
时,会将分组键添加到索引中。
由于 group_keys=True
是 DataFrame.groupby()
和 Series.groupby()
的默认值,因此在使用变换器时不指定 group_keys
将引发 FutureWarning
警告。可以通过指定 group_keys=False
来消除此警告并保留以前的行为。
使用 loc 和 iloc 设置值时的原地操作#
大多数情况下,使用 DataFrame.iloc()
设置值时会尝试原地设置值,仅在必要时才回退到插入新数组。在某些情况下,此规则未被遵循,例如当从具有不同 dtype 的数组设置整个列时
In [30]: df = pd.DataFrame({'price': [11.1, 12.2]}, index=['book1', 'book2'])
In [31]: original_prices = df['price']
In [32]: new_prices = np.array([98, 99])
旧行为:
In [3]: df.iloc[:, 0] = new_prices
In [4]: df.iloc[:, 0]
Out[4]:
book1 98
book2 99
Name: price, dtype: int64
In [5]: original_prices
Out[5]:
book1 11.1
book2 12.2
Name: price, float: 64
此行为已被弃用。在未来版本中,使用 iloc 设置整个列将尝试进行原地操作。
未来行为:
In [3]: df.iloc[:, 0] = new_prices
In [4]: df.iloc[:, 0]
Out[4]:
book1 98.0
book2 99.0
Name: price, dtype: float64
In [5]: original_prices
Out[5]:
book1 98.0
book2 99.0
Name: price, dtype: float64
要获取旧行为,请直接使用 DataFrame.__setitem__()
In [3]: df[df.columns[0]] = new_prices
In [4]: df.iloc[:, 0]
Out[4]
book1 98
book2 99
Name: price, dtype: int64
In [5]: original_prices
Out[5]:
book1 11.1
book2 12.2
Name: price, dtype: float64
当 df.columns
不唯一且你想按索引更改单个列时,要获取旧行为,可以使用 DataFrame.isetitem()
,该方法已在 pandas 1.5 中添加
In [3]: df_with_duplicated_cols = pd.concat([df, df], axis='columns')
In [3]: df_with_duplicated_cols.isetitem(0, new_prices)
In [4]: df_with_duplicated_cols.iloc[:, 0]
Out[4]:
book1 98
book2 99
Name: price, dtype: int64
In [5]: original_prices
Out[5]:
book1 11.1
book2 12.2
Name: 0, dtype: float64
numeric_only
默认值#
在 DataFrame
、DataFrameGroupBy
和 Resampler
操作(例如 min
、sum
和 idxmax
)中,numeric_only
参数的默认值(如果存在)是不一致的。此外,使用默认值 None
的操作可能导致意外结果。 (GH 46560)
In [1]: df = pd.DataFrame({"a": [1, 2], "b": ["x", "y"]})
In [2]: # Reading the next line without knowing the contents of df, one would
# expect the result to contain the products for both columns a and b.
df[["a", "b"]].prod()
Out[2]:
a 2
dtype: int64
为避免此行为,指定值 numeric_only=None
已被弃用,并将在未来版本的 pandas 中移除。将来,所有带有 numeric_only
参数的操作将默认设置为 False
。用户应仅对可进行操作的列调用操作,或者指定 numeric_only=True
以便仅对布尔、整数和浮点列进行操作。
为了支持向新行为的过渡,以下方法新增了 numeric_only
参数。
其他弃用#
在
DataFrame.to_csv()
和Series.to_csv()
中弃用关键字line_terminator
,请改用lineterminator
;这样做是为了与read_csv()
和标准库 'csv' 模块保持一致 (GH 9568)弃用
SparseArray.astype()
、Series.astype()
和DataFrame.astype()
在传递非稀疏dtype
时的行为。在未来的版本中,这将转换为该非稀疏 dtype,而不是将其包装在SparseDtype
中 (GH 34457)弃用
DatetimeIndex.intersection()
和DatetimeIndex.symmetric_difference()
在混合时区时的行为(union
行为已在 1.3.0 版本中弃用);在未来的版本中,两者都将转换为 UTC,而不是 object dtype (GH 39328, GH 45357)弃用
DataFrame.iteritems()
、Series.iteritems()
、HDFStore.iteritems()
,推荐使用DataFrame.items()
、Series.items()
、HDFStore.items()
(GH 45321)弃用
Series.is_monotonic()
和Index.is_monotonic()
,推荐使用Series.is_monotonic_increasing()
和Index.is_monotonic_increasing()
(GH 45422, GH 21335)弃用
DatetimeIndex.astype()
、TimedeltaIndex.astype()
、PeriodIndex.astype()
在转换为int64
以外的整数 dtype 时的行为。在未来的版本中,这些将精确转换为指定的 dtype(而不是始终是int64
),并且如果转换溢出将引发错误 (GH 45034)弃用 DataFrame 和 Series 的
__array_wrap__
方法,转而依赖标准的 numpy ufuncs (GH 45451)弃用在将 float-dtype 数据与时区一起传递给
Series
或DatetimeIndex
时,将其视为 wall-times 的行为 (GH 45573)弃用
Series.fillna()
和DataFrame.fillna()
在使用timedelta64[ns]
dtype 和不兼容填充值时的行为;在未来的版本中,这将转换为一个通用 dtype(通常是 object),而不是引发错误,以匹配其他 dtype 的行为 (GH 45746)弃用
infer_freq()
中的warn
参数 (GH 45947)弃用在
ExtensionArray.argsort()
中允许使用非关键字参数的行为 (GH 46134)弃用在
DataFrame.any()
和DataFrame.all()
中,当bool_only=True
时,将所有布尔值的object
-dtype 列视为布尔类列的行为,应显式转换为 bool (GH 46188)弃用方法
DataFrame.quantile()
的行为,属性numeric_only
将默认为 False。在结果中包含 datetime/timedelta 列 (GH 7308)。弃用
Timedelta.freq
和Timedelta.is_populated
(GH 46430)弃用
Timedelta.delta
(GH 46476)弃用在
DataFrame.any()
和Series.any()
中将参数作为位置参数传递的行为 (GH 44802)弃用向
DataFrame.pivot()
和pivot()
传递位置参数的行为,除了data
(GH 30228)弃用方法
DataFrame.mad()
、Series.mad()
,以及相应的 groupby 方法 (GH 11787)弃用向
Index.join()
传递位置参数的行为,除了other
参数,请改用仅关键字参数 (GH 46518)弃用向
StringMethods.rsplit()
和StringMethods.split()
传递位置参数的行为,除了pat
参数,请改用仅关键字参数 (GH 47423)弃用在时区天真的
DatetimeIndex
上使用表示时区感知 datetime 的字符串进行索引的行为 (GH 46903, GH 36148)弃用在
Timestamp
构造函数中允许使用非整数浮点值作为unit="M"
或unit="Y"
的行为 (GH 47267)弃用全局配置选项
display.column_space
(GH 7576)弃用
factorize()
、Index.factorize()
和ExtensionArray.factorize()
中的参数na_sentinel
;请改用use_na_sentinel=True
来对 NaN 值使用标记值-1
;改用use_na_sentinel=False
而不是na_sentinel=None
来编码 NaN 值 (GH 46910)弃用
DataFrameGroupBy.transform()
在 UDF 返回 DataFrame 时结果不对齐的行为 (GH 45648)澄清了从
to_datetime()
发出的警告,当分隔日期无法根据指定的dayfirst
参数解析时 (GH 46210)当分隔日期无法根据指定的
dayfirst
参数解析时,即使对于省略前导零的日期(例如31/1/2001
),也从to_datetime()
发出警告 (GH 47880)弃用
Series
和Resampler
聚合器(例如min
,max
,sum
,mean
),当 dtype 非数字且提供了numeric_only=True
时引发NotImplementedError
;在未来的版本中,这将引发TypeError
(GH 47500)弃用
Series.rank()
在 dtype 非数字且提供了numeric_only=True
时返回空结果的行为;在未来的版本中,这将引发TypeError
(GH 47500)弃用
Series.mask()
、Series.where()
、DataFrame.mask()
和DataFrame.where()
的参数errors
,因为errors
对这些方法没有影响 (GH 47728)弃用
Rolling
、Expanding
和ExponentialMovingWindow
操作中的参数*args
和**kwargs
(GH 47836)弃用
Categorical.set_ordered()
、Categorical.as_ordered()
和Categorical.as_unordered()
中的inplace
关键字 (GH 37643)弃用使用
cat.categories = ['a', 'b', 'c']
设置 categorical 的类别,请改用Categorical.rename_categories()
(GH 37643)弃用
Series.to_excel()
和DataFrame.to_excel()
中未使用的参数encoding
和verbose
(GH 47912)弃用
DataFrame.set_axis()
和Series.set_axis()
中的inplace
关键字,请改用obj = obj.set_axis(..., copy=False)
(GH 48130)弃用迭代由长度为 1 的列表分组的
DataFrameGroupBy
或SeriesGroupBy
时,产生单个元素的行为;将改回返回长度为 1 的元组 (GH 42795)修正了将
MultiIndex.lesort_depth()
弃用为公共方法的警告消息,因为该消息之前错误地提到了MultiIndex.is_lexsorted()
(GH 38701)弃用
DataFrame.plot()
和Series.plot()
中的sort_columns
参数 (GH 47563)。弃用
DataFrame.to_stata()
和read_stata()
中除第一个参数外的所有位置参数,请改用关键字参数 (GH 48128)。弃用
read_csv()
、read_fwf()
、read_table()
和read_excel()
中的mangle_dupe_cols
参数。该参数从未实现,将改为添加一个新参数,可在其中指定重命名模式 (GH 47718)弃用在
Series.astype()
中允许使用dtype='datetime64'
或dtype=np.datetime64
,请改用 “datetime64[ns]” (GH 47844)
性能改进#
在
DataFrame.corrwith()
中进行列方向 (axis=0) Pearson 和 Spearman 相关计算,且 other 为Series
时的性能改进 (GH 46174)在
DataFrameGroupBy.transform()
和SeriesGroupBy.transform()
中,对于某些用户定义的 DataFrame -> Series 函数的性能改进 (GH 45387)当 subset 仅包含一列时,
DataFrame.duplicated()
的性能改进 (GH 45236)在
DataFrameGroupBy.diff()
和SeriesGroupBy.diff()
中的性能改进 (GH 16706)在
DataFrameGroupBy.transform()
和SeriesGroupBy.transform()
中,当广播用户定义函数的值时的性能改进 (GH 45708)在
DataFrameGroupBy.transform()
和SeriesGroupBy.transform()
中,当仅存在单个分组时,用户定义函数的性能改进 (GH 44977)在
DataFrameGroupBy.apply()
和SeriesGroupBy.apply()
中,当按非唯一未排序索引进行分组时的性能改进 (GH 46527)对
MultiIndex
进行基于元组的索引时,DataFrame.loc()
和Series.loc()
的性能改进 (GH 45681, GH 46040, GH 46330)当
ddof
不为 1 时,DataFrameGroupBy.var()
和SeriesGroupBy.var()
的性能改进 (GH 48152)当索引是
MultiIndex
时,DataFrame.to_records()
的性能改进 (GH 47263)当 MultiIndex 包含 DatetimeIndex, TimedeltaIndex 或 ExtensionDtypes 类型的级别时,
MultiIndex.values
的性能改进 (GH 46288)当 left 和/或 right 为空时,
DataFrame.join()
的性能改进 (GH 46015)当 target 是
MultiIndex
时,DataFrame.reindex()
和Series.reindex()
的性能改进 (GH 46235)在设置 pyarrow 支持的字符串数组中的值时的性能改进 (GH 46400)
在
factorize()
中的性能改进 (GH 46109)在提供
nrows
参数时,read_excel()
的性能改进 (GH 32727)在应用重复 CSS 格式时,
Styler.to_excel()
的性能改进 (GH 47371)在
MultiIndex.is_monotonic_increasing()
中的性能改进 (GH 47458)在
BusinessHour
的str
和repr
中进行性能改进 (GH 44764)当使用默认 strftime 格式
"%Y-%m-%d %H:%M:%S"
或"%Y-%m-%d %H:%M:%S.%f"
之一时,日期时间数组字符串格式化的性能得到改进。 (GH 44764)在处理时间数组时,
Series.to_sql()
和DataFrame.to_sql()
(SQLiteTable
) 的性能得到改进。 (GH 44764)对
read_sas()
的性能改进 (GH 47404)对于
arrays.SparseArray
的argmax
和argmin
的性能改进 (GH 34197)
错误修复#
分类#
Categorical.view()
中不接受整数 dtype 的错误 (GH 25464)在
CategoricalIndex.union()
中存在错误,当索引的类别为整数 dtype 且索引包含NaN
值时,错误地引发异常而不是转换为float64
(GH 45362)在
concat()
中存在错误,当连接两个(或多个)无序的CategoricalIndex
变量(其类别是排列)时,产生不正确的索引值 (GH 24845)
日期时间类#
在
DataFrame.quantile()
中存在错误,对于日期时间类 dtype 且没有行时,错误地返回float64
dtype 而非保留日期时间类 dtype (GH 41544)在
to_datetime()
中存在错误,对于np.str_
对象的序列,错误地引发异常 (GH 32264)在
Timestamp
构造中存在错误,当将日期时间组件作为位置参数传递并将tzinfo
作为关键字参数时,错误地引发异常 (GH 31929)在
Index.astype()
中存在错误,当从 object dtype 转换为timedelta64[ns]
dtype 时,错误地将np.datetime64("NaT")
值转换为np.timedelta64("NaT")
而非引发异常 (GH 45722)在
SeriesGroupBy.value_counts()
中存在错误,当传递分类列时的索引不正确 (GH 44324)在
DatetimeIndex.tz_localize()
中存在错误,本地化为 UTC 时未能复制底层数据 (GH 46460)在
DatetimeIndex.resolution()
中存在错误,对于纳秒级分辨率的索引,错误地返回“day”而非“nanosecond” (GH 46903)在
Timestamp
中存在错误,对于具有整数或浮点值以及unit="Y"
或unit="M"
的情况,结果略微不正确 (GH 47266)在
DatetimeArray
构造中存在错误,当传递另一个DatetimeArray
并设置freq=None
时,错误地从给定数组推断 freq (GH 47296)在
to_datetime()
中存在错误,其中即使设置了errors=coerce
,在行数超过 50 行时也会抛出OutOfBoundsDatetime
异常 (GH 45319)添加
DateOffset
到Series
中时存在错误,不会添加nanoseconds
字段 (GH 47856)
时间差#
时区#
数值#
在与具有
dtype="boolean"
和NA
的类数组对象进行操作时存在错误,错误地就地修改数组 (GH 45421)在
floordiv
中存在错误,当除以IntegerDtype
类型的0
时,返回0
而非inf
(GH 48223)在对具有
dtype="boolean"
的类数组对象执行除法、pow
和mod
运算时存在错误,表现与对应的np.bool_
类型不同 (GH 46063)将具有
IntegerDtype
或FloatingDtype
的Series
乘以具有timedelta64[ns]
dtype 的类数组对象时存在错误,错误地引发异常 (GH 45622)在
mean()
中存在错误,其中可选依赖项bottleneck
导致与数组长度呈线性关系的精度损失。已在mean()
中禁用bottleneck
,将损失改进为对数线性,但这可能导致性能下降。 (GH 42878)
转换#
在
DataFrame.astype()
中不保留子类的错误 (GH 40810)从包含浮点数的列表或浮点 dtype 的类似 ndarray 对象(例如
dask.Array
)以及整数 dtype 构造Series
时存在错误,引发异常而不是像np.ndarray
那样进行转换 (GH 40110)在
Float64Index.astype()
转换为无符号整数 dtype 时存在错误,错误地转换为np.int64
dtype (GH 45309)从浮点 dtype 转换为无符号整数 dtype 时,
Series.astype()
和DataFrame.astype()
在存在负值时未能引发异常的错误 (GH 45151)在
array()
中存在错误,对于FloatingDtype
和包含可转换为浮点数的字符串值时,错误地引发异常 (GH 45424)比较字符串和 datetime64ns 对象时导致
OverflowError
异常的错误。 (GH 45506)通用抽象 dtype 的元类中存在错误,导致
DataFrame.apply()
和Series.apply()
在处理内置函数type
时引发异常 (GH 46684)在
DataFrame.to_records()
中存在错误,当索引是MultiIndex
时返回不一致的 numpy 类型 (GH 47263)在
DataFrame.to_dict()
中存在错误,当设置orient="list"
或orient="index"
时,不返回原生类型 (GH 46751)在
DataFrame.apply()
中存在错误,当应用于空的DataFrame
并设置axis=1
时,返回DataFrame
而非Series
(GH 39111)从一个*非* NumPy
ndarray
的可迭代对象(包含所有 NumPy 无符号整数标量)推断 dtype 时存在错误,未得到无符号整数 dtype (GH 47294)在
DataFrame.eval()
中存在错误,当 pandas 对象(例如 `'Timestamp'`)作为列名时 (GH 44603)
字符串#
在
str.startswith()
和str.endswith()
中存在错误,当使用其他 Series 作为参数 _pat_ 时。现在会引发TypeError
(GH 3485)在
Series.str.zfill()
中存在错误,当字符串包含前导符号时,在符号字符前而非后填充 ‘0’,这与标准库的str.zfill
不同 (GH 20868)
区间#
在
IntervalArray.__setitem__()
中存在错误,当将np.nan
设置到由整数支持的数组中时,引发ValueError
而非TypeError
(GH 45484)在
IntervalDtype
中存在错误,当使用 datetime64[ns, tz] 作为 dtype 字符串时 (GH 46999)
索引#
在
DataFrame.iloc()
中存在错误,其中当对具有单个 ExtensionDtype 列的DataFrame
进行单行索引时,返回的是副本而非底层数据的视图 (GH 45241)在
DataFrame.__getitem__()
中存在错误,当DataFrame
包含重复列时(即使选择了唯一列)返回副本 (GH 45316, GH 41062)在
Series.align()
中存在错误,当两个 MultiIndex 的交集相同时,不创建包含级别并集的MultiIndex
(GH 45224)将 NA 值(
None
或np.nan
)设置到具有基于整数的IntervalDtype
的Series
中时存在错误,错误地转换为 object dtype 而非基于浮点数的IntervalDtype
(GH 45568)设置值时的索引错误,当使用
df.iloc[:, i] = values
将值设置到ExtensionDtype
列中,且values
与df.iloc[:, i]
具有相同 dtype 时,错误地插入新数组而非就地设置 (GH 33457)在
Series.__setitem__()
中存在错误,当Index
为非整数类型,且使用整数键设置无法就地设置的值时,错误地引发了ValueError
而非转换为通用 dtype (GH 45070)在
DataFrame.loc()
中存在错误,当将值作为列表设置到DataFrame
中时,未将None
转换为NA
(GH 47987)在
Series.__setitem__()
中存在错误,当将不兼容的值设置到PeriodDtype
或IntervalDtype
类型的Series
中时,使用布尔掩码索引时引发异常,但使用等效的其他索引方式时则进行强制转换;现在这些操作(包括Series.mask()
和Series.where()
)都会一致地进行强制转换 (GH 45768)在
DataFrame.where()
中存在错误,对于包含多个日期时间类 dtype 列的情况,未能将结果向下转换为与其他 dtype 一致的类型 (GH 45837)在
isin()
中存在错误,当使用无符号整数 dtype 和不带 dtype 的类列表参数时,向上转换为float64
(GH 46485)在
Series.loc.__setitem__()
和Series.loc.__getitem__()
中存在错误,当使用多个键但未使用MultiIndex
时未引发异常 (GH 13831)在
Index.reindex()
中存在错误,当指定了level
但未提供MultiIndex
时引发AssertionError
;现在 level 参数会被忽略 (GH 35132)设置对于
Series
dtype 过大的值时存在错误,未能强制转换为通用类型 (GH 26049, GH 32878)在
loc.__setitem__()
中存在错误,将range
键视为位置索引而非标签索引 (GH 45479)在
DataFrame.__setitem__()
中存在错误,当使用标量键和DataFrame
作为值进行设置时,将 extension array dtype 转换为 object 类型 (GH 46896)在
Series.__setitem__()
中存在错误,当将标量设置到可空的 pandas dtype 时,如果标量无法(无损地)转换为可空类型,则不会引发TypeError
(GH 45404)在
Series.__setitem__()
中存在错误,当设置包含NA
的boolean
dtype 值时,错误地引发异常而非转换为boolean
dtype (GH 45462)在
Series.loc()
中存在错误,当Index
不匹配时,使用包含NA
的布尔索引器会引发异常 (GH 46551)在
Series.__setitem__()
中存在错误,其中将NA
设置到数值型 dtype 的Series
中时,错误地向上转换为 object-dtype,而非将该值视为np.nan
(GH 44199)在
DataFrame.loc()
中存在错误,当将值设置到列中且右侧是一个字典时 (GH 47216)在
Series.__setitem__()
中存在错误,对于datetime64[ns]
dtype、全False
布尔掩码和不兼容值的情况,错误地转换为object
类型而非保留datetime64[ns]
dtype (GH 45967)在
Index.__getitem__()
中存在错误,当索引器是带有NA
的布尔 dtype 时引发ValueError
(GH 45806)在
Series.mask()
中存在错误,当设置inplace=True
或使用带有小整数 dtype 的布尔掩码设置值时,错误地引发异常 (GH 45750)在
DataFrame.mask()
中存在错误,当设置inplace=True
且包含ExtensionDtype
列时,错误地引发异常 (GH 45577)从 DataFrame 中获取列时的错误,当行索引为 object dtype 且包含日期时间类值时:现在生成的 Series 会保留父 DataFrame 中精确的 object-dtype Index (GH 42950)
在
DataFrame.__getattribute__()
中存在错误,如果列具有 `"string"` dtype 则引发AttributeError
(GH 46185)在
DataFrame.compare()
中存在错误,当比较 extension array dtype 和 numpy dtype 时,返回全NaN
的列 (GH 44014)在
DataFrame.where()
中存在错误,对于 numpy dtype,使用 `"boolean"` 掩码设置错误值 (GH 44014)对具有
np.str_
键的DatetimeIndex
进行索引时存在错误,错误地引发异常 (GH 45580)在
CategoricalIndex.get_indexer()
中存在错误,当索引包含NaN
值时,导致目标中存在但索引中不存在的元素被映射到NaN
元素的索引,而非 -1 (GH 45361)在将大型整数值设置到
Series
中时出现错误,当其 dtype 为float32
或float16
时,这些值被错误地修改了,而不是强制转换为float64
dtype (GH 45844)Series.asof()
和DataFrame.asof()
中存在错误,错误地将 bool-dtype 结果强制转换为float64
dtype (GH 16063)NDFrame.xs()
、DataFrame.iterrows()
、DataFrame.loc()
和DataFrame.iloc()
中存在错误,并非总是传播元数据 (GH 28283)DataFrame.sum()
中存在错误,如果输入包含 NaN,min_count
会改变 dtype (GH 46947)IntervalTree
中存在导致无限递归的错误。(GH 46658)PeriodIndex
中存在错误,在索引 NA 时引发AttributeError
,而不是将其替换为NaT
。(GH 46673)DataFrame.at()
中存在错误,会允许修改多个列 (GH 48296)
缺失值#
Series.fillna()
和DataFrame.fillna()
中存在错误,在某些不存在 NA 值的情况下,downcast
关键字未被遵守 (GH 45423)Series.fillna()
和DataFrame.fillna()
中存在错误,对于IntervalDtype
和不兼容的值,会引发异常而不是强制转换为通用(通常是对象)dtype (GH 45796)Series.map()
中存在错误,如果映射器是dict
或Series
,则不遵守na_action
参数 (GH 47527)DataFrame.interpolate()
中存在错误,对于 object-dtype 列,当inplace=False
时不返回副本 (GH 45791)DataFrame.dropna()
中存在错误,允许同时设置不兼容的how
和thresh
参数 (GH 46575)DataFrame.fillna()
中存在错误,当DataFrame
是单块时忽略axis
参数 (GH 47713)
多级索引#
DataFrame.loc()
中存在错误,当使用负步长和非空起始/停止值对MultiIndex
进行切片时返回空结果 (GH 46156)DataFrame.loc()
中存在错误,当使用除 -1 以外的负步长对MultiIndex
进行切片时引发异常 (GH 46156)DataFrame.loc()
中存在错误,当使用负步长和非整数标签索引级别对MultiIndex
进行切片时引发异常 (GH 46156)Series.to_numpy()
中存在错误,当提供na_value
时,多级索引的 Series 无法转换为 numpy 数组 (GH 45774)MultiIndex.equals
中存在错误,当只有一侧具有扩展数组 dtype 时,该方法不具有交换性 (GH 46026)MultiIndex.from_tuples()
中存在错误,无法构建空元组的 Index (GH 45608)
输入/输出#
DataFrame.to_stata()
中存在错误,如果DataFrame
包含-np.inf
,则不引发错误 (GH 45350)read_excel()
中存在错误,对于某些skiprows
可调用对象会导致无限循环 (GH 45585)DataFrame.info()
中存在错误,当对空DataFrame
调用时,输出末尾的换行符被省略 (GH 45494)read_csv()
中存在错误,对于engine="c"
的on_bad_lines="warn"
不识别换行符 (GH 41710)DataFrame.to_csv()
中存在错误,对于Float64
dtype 不遵守float_format
(GH 45991)read_csv()
中存在错误,并非在所有情况下都遵守指定的用于索引列的转换器 (GH 40589)read_csv()
中存在错误,即使index_col=False
也将第二行解释为Index
名称 (GH 46569)read_parquet()
中存在错误,当engine="pyarrow"
且传入不支持数据类型的列时导致部分写入磁盘 (GH 44914)DataFrame.to_excel()
和ExcelWriter
中存在错误,在将空DataFrame
写入.ods
文件时会引发异常 (GH 45793)read_csv()
中存在错误,对于engine="python"
忽略不存在的标题行 (GH 47400)read_excel()
中存在错误,当header
引用不存在的行时引发不受控制的IndexError
(GH 43143)read_html()
中存在错误,`
` 周围的元素在连接时没有空格 (GH 29528)read_csv()
中存在错误,当数据长于标题行时,导致usecols
中期望字符串的可调用对象出现问题 (GH 46997)Parquet 往返过程中存在错误,当 `Interval dtype` 具有
datetime64[ns]
子类型时 (GH 45881)read_excel()
中存在错误,读取包含 XML 元素之间换行的.ods
文件时 (GH 45598)read_parquet()
中存在错误,当engine="fastparquet"
时,文件在出错时未关闭 (GH 46555)DataFrame.to_html()
现在当border
关键字设置为False
时,会从<table>
元素中排除border
属性。read_sas()
中存在错误,对于某些类型的压缩 `SAS7BDAT` 文件 (GH 35545)read_excel()
中存在错误,在未给出名称时未向前填充MultiIndex
(GH 47487)read_sas()
中存在错误,对于零行的 `SAS7BDAT` 文件返回None
而不是空 DataFrame (GH 18198)DataFrame.to_string()
中存在错误,在MultiIndex
中使用扩展数组时使用了错误的缺失值 (GH 47986)StataWriter
中存在错误,值标签总是使用默认编码写入 (GH 46750)StataWriterUTF8
中存在错误,某些有效字符从变量名中移除 (GH 47276)DataFrame.to_excel()
中存在错误,当写入具有MultiIndex
的空 dataframe 时 (GH 19543)read_sas()
中存在错误,对于包含 0x40 控制字节的 RLE 压缩 `SAS7BDAT` 文件 (GH 31243)read_sas()
中存在错误,会扰乱列名 (GH 31243)read_sas()
中存在错误,对于包含 0x00 控制字节的 RLE 压缩 `SAS7BDAT` 文件 (GH 47099)read_parquet()
中存在错误,当use_nullable_dtypes=True
时,返回 `float64` dtype 而不是可空的Float64
dtype (GH 45694)DataFrame.to_json()
中存在错误,`PeriodDtype` 在使用read_json()
读取回时无法完成序列化往返 (GH 44720)read_xml()
中存在错误,读取带有中文字符标签的 XML 文件时会引发XMLSyntaxError
(GH 47902)
周期#
从
PeriodArray
中减去Period
时返回错误结果的错误 (GH 45999)Period.strftime()
和PeriodIndex.strftime()
中存在错误,指令%l
和%u
返回错误结果 (GH 46252)从具有非零纳秒和
freq="ns"
的Timestamp
或np.datetime64
对象构造Period
时错误截断纳秒的错误 (GH 46811)将
np.timedelta64("NaT", "ns")
添加到具有 timedelta-like freq 的Period
时,错误地引发IncompatibleFrequency
而不是返回NaT
的错误 (GH 47196)将整数数组添加到具有
PeriodDtype
的数组时,当dtype.freq.n > 1
时给出错误结果的错误 (GH 47209)从具有
PeriodDtype
的数组中减去Period
时,当操作溢出时返回错误结果而不是引发OverflowError
的错误 (GH 47538)
绘图#
DataFrame.plot.barh()
中存在错误,阻止了 x 轴标签设置,以及xlabel
更新 y 轴标签 (GH 45144)DataFrame.plot.box()
中存在错误,阻止了 x 轴标签设置 (GH 45463)DataFrame.boxplot()
中存在错误,阻止了传入xlabel
和ylabel
(GH 45463)DataFrame.boxplot()
中存在错误,阻止了指定vert=False
(GH 36918)DataFrame.plot.scatter()
中存在错误,阻止了指定norm
(GH 45809)修复了当未设置
ylabel
时,Series.plot()
在 y 轴标签中显示“None”的问题 (GH 46129)DataFrame.plot()
中存在错误,在绘制季度 series 时,导致xticks
和垂直网格位置不正确 (GH 47602)DataFrame.plot()
中存在错误,阻止了为次要 y 轴设置 y 轴标签、范围和刻度 (GH 47753)
分组/重采样/滚动#
DataFrame.resample()
中存在错误,在TimedeltaIndex
上忽略了closed="right"
(GH 45414)DataFrameGroupBy.transform()
中存在错误,当func="size"
且输入 DataFrame 有多个列时失败 (GH 27469)DataFrameGroupBy.size()
和DataFrameGroupBy.transform()
在axis=1
且func="size"
时存在 Bug,会产生不正确的结果 (GH 45715)ExponentialMovingWindow.mean()
在axis=1
和engine='numba'
模式下存在 Bug,当DataFrame
的列多于行时会产生问题 (GH 46086)当使用
engine="numba"
模式时存在 Bug,修改engine_kwargs
会返回相同的 JIT 编译函数 (GH 46086)DataFrameGroupBy.transform()
在axis=1
且func
是"first"
或"last"
时存在 Bug,会导致失败 (GH 45986)DataFrameGroupBy.cumsum()
在skipna=False
时存在 Bug,会给出不正确的结果 (GH 46216)DataFrameGroupBy.sum()
,SeriesGroupBy.sum()
,DataFrameGroupBy.prod()
,SeriesGroupBy.prod, :meth:()
.DataFrameGroupBy.cumsum`, 和SeriesGroupBy.cumsum()
在使用整数数据类型时存在 Bug,会导致精度丢失 (GH 37493)DataFrameGroupBy.cumsum()
和SeriesGroupBy.cumsum()
在使用timedelta64[ns]
数据类型时存在 Bug,未能将NaT
识别为 null 值 (GH 46216)DataFrameGroupBy.cumsum()
和SeriesGroupBy.cumsum()
在使用整数数据类型时存在 Bug,当总和大于数据类型的最大值时会导致溢出 (GH 37493)DataFrameGroupBy.cummin()
,SeriesGroupBy.cummin()
,DataFrameGroupBy.cummax()
和SeriesGroupBy.cummax()
在使用可空数据类型时存在 Bug,会错误地就地修改原始数据 (GH 46220)DataFrame.groupby()
在MultiIndex
的第一级包含None
时存在 Bug,会引发错误 (GH 47348)DataFrameGroupBy.cummax()
和SeriesGroupBy.cummax()
在使用int64
数据类型且第一个值是最小的 int64 可能值时存在 Bug (GH 46382)DataFrameGroupBy.cumprod()
和SeriesGroupBy.cumprod()
在使用skipna=False
时存在 Bug,NaN
会影响不同列中的计算 (GH 48064)DataFrameGroupBy.max()
和SeriesGroupBy.max()
在分组为空且使用uint64
数据类型时存在 Bug,会错误地引发RuntimeError
错误 (GH 46408)DataFrameGroupBy.apply()
和SeriesGroupBy.apply()
在func
是字符串且提供了 args 或 kwargs 时存在 Bug,会导致失败 (GH 46479)SeriesGroupBy.apply()
在只有一个分组时存在 Bug,会错误地命名其结果 (GH 46369)Rolling.sum()
和Rolling.mean()
在窗口内的值为相同值时存在 Bug,会给出不正确的结果 (GH 42064, GH 46431)Rolling.var()
和Rolling.std()
在窗口内的值为相同值时存在 Bug,会给出非零结果 (GH 42064)Rolling.skew()
和Rolling.kurt()
在窗口内的值为相同值时存在 Bug,会给出 NaN (GH 30993)Rolling.var()
在窗口大小大于数据大小时计算加权方差存在 Bug,会导致段错误 (GH 46760)Grouper.__repr__()
存在 Bug,其中未包含dropna
参数,现在已包含 (GH 46754)DataFrame.rolling()
在 center=True, axis=1 且指定了 win_type 时存在 Bug,会引发 ValueError 错误 (GH 46135)DataFrameGroupBy.describe()
和SeriesGroupBy.describe()
在处理空数据集时存在 Bug,会产生不一致的结果 (GH 41575)DataFrame.resample()
的 reduction 方法在与on
参数一起使用时存在 Bug,会尝试聚合提供的列 (GH 47079)DataFrame.groupby()
和Series.groupby()
在输入 DataFrame/Series 的MultiIndex
中有 NaN 值时存在 Bug,不会遵循dropna=False
设置 (GH 46783)DataFrameGroupBy.resample()
在从缺少重采样键的键列表中获取结果时存在 Bug,会引发KeyError
错误 (GH 47362)DataFrame.groupby()
在 DataFrame 为空进行转换(如 fillna)时存在 Bug,会丢失索引列 (GH 47787)DataFrame.groupby()
和Series.groupby()
在使用dropna=False
和sort=False
时存在 Bug,会将任何空值分组放在末尾,而不是按它们出现的顺序 (GH 46584)
重塑#
concat()
介于整数数据类型的Series
和分类数据类型(分类为整数且包含NaN
值)的 Series 之间时存在 Bug,会转换为对象数据类型而不是float64
(GH 45359)get_dummies()
存在 Bug,选择了对象和分类数据类型,但未选择字符串数据类型 (GH 44965)DataFrame.align()
在将MultiIndex
与另一个MultiIndex
的Series
对齐时存在 Bug (GH 46001)与
IntegerDtype
或FloatingDtype
数组进行连接时存在 Bug,结果数据类型未反映非可空数据类型的行为 (GH 46379)concat()
在join="outer"
且sort=True
时存在 Bug,会丢失列的数据类型 (GH 47329)concat()
在使用相同的键时存在 Bug,会在索引MultiIndex
时导致错误 (GH 46519)pivot_table()
在dropna=True
且聚合列具有扩展数组数据类型时存在 Bug,会引发TypeError
错误 (GH 47477)merge()
在使用 ssl 库的 FIPS 模式时存在 Bug,对于how="cross"
会引发错误 (GH 48024)DataFrame.join()
在使用列表并通过后缀连接具有重复列名的 DataFrame 时存在 Bug (GH 46396)DataFrame.pivot_table()
在使用sort=False
时存在 Bug,会导致索引被排序 (GH 17041)concat()
在axis=1
且sort=False
时存在 Bug,会导致结果索引是Int64Index
而不是RangeIndex
(GH 46675)wide_to_long()
在columns
中缺少stubnames
且i
包含字符串数据类型列时存在 Bug,会引发错误 (GH 46044)DataFrame.join()
在使用分类索引时存在 Bug,会导致意外的重新排序 (GH 47812)
稀疏#
Series.where()
和DataFrame.where()
在使用SparseDtype
时存在 Bug,未能保留数组的fill_value
(GH 45691)SparseArray.unique()
存在 Bug,未能保持原始元素顺序 (GH 47809)
扩展数组#
IntegerArray.searchsorted()
和FloatingArray.searchsorted()
在处理np.nan
时存在 Bug,返回不一致的结果 (GH 45255)
样式#
在尝试将样式函数应用于空 DataFrame 子集时存在 Bug (GH 45313)
CSSToExcelConverter
在使用xlsxwriter
引擎且未提供边框样式时提供了边框颜色时存在 Bug,会导致TypeError
错误 (GH 42276)Styler.set_sticky()
存在 Bug,在深色模式下会导致白色文本出现在白色背景上 (GH 46984)Styler.to_latex()
存在 Bug,当clines="all;data"
且DataFrame
没有行时会导致UnboundLocalError
错误 (GH 47203)Styler.to_excel()
在使用xlsxwriter
引擎并设置vertical-align: middle;
时存在 Bug (GH 30107)在将样式应用于具有布尔列标签的 DataFrame 时存在 Bug (GH 47838)
元数据#
修复了
DataFrame.melt()
中的元数据传播问题 (GH 28283)修复了
DataFrame.explode()
中的元数据传播问题 (GH 28283)
其他#
assert_index_equal()
在names=True
和check_order=False
时存在 Bug,未检查名称 (GH 47328)
贡献者#
共有 271 人为本次发布贡献了补丁。名字旁有 "+" 的人是首次贡献。
Aadharsh Acharya +
Aadharsh-Acharya +
Aadhi Manivannan +
Adam Bowden
Aditya Agarwal +
Ahmed Ibrahim +
Alastair Porter +
Alex Povel +
Alex-Blade
Alexandra Sciocchetti +
AlonMenczer +
Andras Deak +
Andrew Hawyrluk
Andy Grigg +
Aneta Kahleová +
Anthony Givans +
Anton Shevtsov +
B. J. Potter +
BarkotBeyene +
Ben Beasley +
Ben Wozniak +
Bernhard Wagner +
Boris Rumyantsev
Brian Gollop +
CCXXXI +
Chandrasekaran Anirudh Bhardwaj +
Charles Blackmon-Luca +
Chris Moradi +
ChrisAlbertsen +
Compro Prasad +
DaPy15
Damian Barabonkov +
Daniel I +
Daniel Isaac +
Daniel Schmidt
Danil Iashchenko +
Dare Adewumi
Dennis Chukwunta +
Dennis J. Gray +
Derek Sharp +
Dhruv Samdani +
Dimitra Karadima +
Dmitry Savostyanov +
Dmytro Litvinov +
Do Young Kim +
Dries Schaumont +
Edward Huang +
Eirik +
Ekaterina +
Eli Dourado +
Ezra Brauner +
Fabian Gabel +
FactorizeD +
Fangchen Li
Francesco Romandini +
Greg Gandenberger +
Guo Ci +
Hiroaki Ogasawara
Hood Chatham +
Ian Alexander Joiner +
Irv Lustig
Ivan Ng +
JHM Darbyshire
JHM Darbyshire (MBP)
JHM Darbyshire (iMac)
JMBurley
Jack Goldsmith +
James Freeman +
James Lamb
James Moro +
Janosh Riebesell
Jarrod Millman
Jason Jia +
Jeff Reback
Jeremy Tuloup +
Johannes Mueller
John Bencina +
John Mantios +
John Zangwill
Jon Bramley +
Jonas Haag
Jordan Hicks
Joris Van den Bossche
Jose Ortiz +
JosephParampathu +
José Duarte
Julian Steger +
Kai Priester +
Kapil E. Iyer +
Karthik Velayutham +
Kashif Khan
Kazuki Igeta +
Kevin Jan Anker +
Kevin Sheppard
Khor Chean Wei
Kian Eliasi
Kian S +
Kim, KwonHyun +
Kinza-Raza +
Konjeti Maruthi +
Leonardus Chen
Linxiao Francis Cong +
Loïc Estève
LucasG0 +
Lucy Jiménez +
Luis Pinto
Luke Manley
Marc Garcia
Marco Edward Gorelli
Marco Gorelli
MarcoGorelli
Margarete Dippel +
Mariam-ke +
Martin Fleischmann
Marvin John Walter +
Marvin Walter +
Mateusz
Matilda M +
Matthew Roeschke
Matthias Bussonnier
MeeseeksMachine
Mehgarg +
Melissa Weber Mendonça +
Michael Milton +
Michael Wang
Mike McCarty +
Miloni Atal +
Mitlasóczki Bence +
Moritz Schreiber +
Morten Canth Hels +
Nick Crews +
NickFillot +
Nicolas Hug +
Nima Sarang
Noa Tamir +
Pandas Development Team
Parfait Gasana
Parthi +
Partho +
Patrick Hoefler
Peter
Peter Hawkins +
Philipp A
Philipp Schaefer +
Pierrot +
Pratik Patel +
Prithvijit
Purna Chandra Mansingh +
Radoslaw Lemiec +
RaphSku +
Reinert Huseby Karlsen +
Richard Shadrach
Richard Shadrach +
Robbie Palmer
Robert de Vries
Roger +
Roger Murray +
Ruizhe Deng +
SELEE +
Sachin Yadav +
Saiwing Yeung +
Sam Rao +
Sandro Casagrande +
Sebastiaan Vermeulen +
Shaghayegh +
Shantanu +
Shashank Shet +
Shawn Zhong +
Shuangchi He +
Simon Hawkins
Simon Knott +
Solomon Song +
Somtochi Umeh +
Stefan Krawczyk +
Stefanie Molin
Steffen Rehberg
Steven Bamford +
Steven Rotondo +
Steven Schaerer
Sylvain MARIE +
Sylvain Marié
Tarun Raghunandan Kaushik +
Taylor Packard +
Terji Petersen
Thierry Moisan
Thomas Grainger
Thomas Hunter +
Thomas Li
Tim McFarland +
Tim Swast
Tim Yang +
Tobias Pitters
Tom Aarsen +
Tom Augspurger
Torsten Wörtwein
TraverseTowner +
Tyler Reddy
Valentin Iovene
Varun Sharma +
Vasily Litvinov
Venaturum
Vinicius Akira Imaizumi +
Vladimir Fokow +
Wenjun Si
Will Lachance +
William Andrea
Wolfgang F. Riedl +
Xingrong Chen
Yago González
Yikun Jiang +
Yuanhao Geng
Yuval +
Zero
Zhengfei Wang +
abmyii
alexondor +
alm
andjhall +
anilbey +
arnaudlegout +
asv-bot +
ateki +
auderson +
bherwerth +
bicarlsen +
carbonleakage +
charles +
charlogazzo +
code-review-doctor +
dataxerik +
deponovo
dimitra-karadima +
dospix +
ehallam +
ehsan shirvanian +
ember91 +
eshirvana
fractionalhare +
gaotian98 +
gesoos
github-actions[bot]
gunghub +
hasan-yaman
iansheng
iasoon
jbrockmendel
joshuabello2550
jyuv
kouya takahashi
mariana-LJ
matt
mattB1989
nealxm
partev
poloso
realead
roib20
rtpsw
ryangilmour
shourya5
srotondo
stanleycai95
staticdev
tehunter
theidexisted
tobias.pitters
uncjackg
vernetya
wany-oh
wfr
z3c0