1.5.0 中的新功能(2022年9月19日)#

这是 pandas 1.5.0 中的更改。请参阅 发行说明 以获取包括其他版本 pandas 的完整更新日志。

增强功能#

pandas-stubs#

pandas-stubs 库现在由 pandas 开发团队支持,为 pandas API 提供类型存根。更多信息请访问 pandas-dev/pandas-stubs

我们感谢 VirtusLab 和 Microsoft 对 pandas-stubs 的最初、重大贡献。

原生 PyArrow 支持的 ExtensionArray#

安装了 Pyarrow 后,用户现在可以创建由 pyarrow.ChunkedArraypyarrow.DataType 支持的 pandas 对象。

dtype 参数可以接受一个带有 pyarrow 数据类型 的字符串,并在括号中包含 pyarrow,例如 "int64[pyarrow]",或者对于需要参数的 pyarrow 数据类型,可以使用初始化了一个 pyarrow.DataTypeArrowDtype

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 数据帧“导出”为交换对象,因此任何实现了该协议的库都可以“导入”该数据帧,而无需了解生产者的任何信息,除了它生成一个交换对象。

  • 新功能 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中添加渲染 borderborder-{side} CSS 属性的能力 (GH 42276)

  • 使关键字参数一致:Styler.highlight_null() 现在接受 color 并弃用 null_color,尽管这仍然向后兼容 (GH 45907)

使用 group_keys 控制索引在 DataFrame.resample()#

参数 group_keys 已添加到方法 DataFrame.resample() 中。与 DataFrame.groupby() 一样,当使用 Resampler.apply() 时,此参数控制是否将每个组添加到重采样中的索引。

警告

如果不指定 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() 用于将一个虚拟编码的 DataFrame 转换为分类的 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 库。更多详情,请参见 IO 文档中的 ORC

警告

  • 强烈建议使用 conda 安装 pyarrow,因为 pyarrow 存在一些问题。

  • to_orc() 需要 pyarrow>=7.0.0。

  • to_orc() 在 Windows 上尚不支持,您可以在 安装可选依赖项 找到有效的环境。

  • 有关支持的数据类型,请参阅 Arrow 中支持的 ORC 功能

  • 当前,在将数据框转换为ORC文件时,datetime列中的时区不会被保留。

df = pd.DataFrame(data={"col1": [1, 2], "col2": [3, 4]})
df.to_orc("./out.orc")

直接从 TAR 存档中读取#

read_csv()DataFrame.to_json() 这样的 I/O 方法现在允许直接在 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

modetarfile.open 的模式之一:https://docs.python.org/3/library/tarfile.html#tarfile.open

read_xml 现在支持 dtypeconvertersparse_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[s]
dtype: object

read_xml 现在支持使用 iterparse 处理大型 XML#

对于大小从几百兆字节到千兆字节的非常大的XML文件,pandas.read_xml() 现在支持使用 lxml’s iterparseetree’s 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 (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
   ....: 

更详细的解释可以在这里找到 这里

其他增强功能#

值得注意的错误修复#

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

使用 dropna=Truegroupby 转换#

转换是一种结果大小与其输入相同的操作。当结果是 DataFrameSeries 时,还要求结果的索引与输入的索引匹配。在 pandas 1.4 中,使用 DataFrameGroupBy.transform()SeriesGroupBy.transform() 处理组中的空值并设置 dropna=True 时,结果不正确。如下面的示例所示,不正确的结果要么包含不正确的值,要么结果的索引与输入的索引不相同。

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

使用 iso_dates=True 序列化 tz-naive 时间戳与 to_json()#

DataFrame.to_json(), Series.to_json(), 和 Index.to_json() 会错误地将带有 tz-naive 时间戳的 DatetimeArrays/DatetimeIndexes 本地化为 UTC。(GH 38760)

请注意,此补丁不会修复在序列化时将时区感知的时间戳本地化到UTC的问题。(相关问题 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 变化#

增加依赖项的最小版本#

一些依赖项的最低支持版本已更新。如果已安装,我们现在要求:

最低版本

必需的

Changed

numpy

1.20.3

X

X

mypy (dev)

0.971

X

beautifulsoup4

4.9.3

X

blosc

1.21.0

X

瓶颈

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 开发过程中目前测试的最低版本。低于最低测试版本的可选库可能仍然有效,但不被视为支持。

最低版本

Changed

beautifulsoup4

4.9.3

X

blosc

1.21.0

X

瓶颈

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“out of band” (复制粘贴) 流程auth_local_webserver = False 选项计划在2022年10月停止工作。(GH 46312)

  • read_json() 现在在输入是以 .json.json.gz.json.bz2 等结尾的字符串但不存在这样的文件时,会引发 FileNotFoundError``(之前是 ``ValueError)。(GH 29102)

  • TimestampTimedelta 的操作,如果以前会引发 OverflowError ,现在会在适当的情况下引发 OutOfBoundsDatetimeOutOfBoundsTimedelta (GH 47268)

  • read_sas() 之前返回 None 时,现在返回一个空的 DataFrame (GH 47410)

  • DataFrame 构造函数在 indexcolumns 参数为集合时会引发异常 (GH 47215)

弃用#

警告

在下一个主要版本发布,2.0中,正在考虑几个较大的API更改,而没有正式的弃用,例如使标准库 zoneinfo 成为默认的时区实现,而不是 pytz,让 Index 支持所有数据类型,而不是有多个子类(CategoricalIndexInt64Index 等),等等。正在考虑的更改记录在 这个GitHub问题 中,欢迎任何反馈或关注。

基于标签的整数切片在一个带有 Int64Index 或 RangeIndex 的 Series 上#

在未来的版本中,对带有 Int64IndexRangeIndexSeries 进行整数切片将被视为 基于标签的,而不是位置的。这将使行为与其他 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.bookExcelWriter.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=TrueDataFrame.groupby()Series.groupby() 的默认值,在使用转换器时不指定 group_keys 将引发 FutureWarning。可以通过指定 group_keys=False 来静默此警告并保留之前的行为。

使用 lociloc 设置值时的就地操作#

大多数情况下,使用 DataFrame.iloc() 设置值会尝试就地设置值,只有在必要时才会回退到插入新数组。有些情况下不遵循这一规则,例如当使用具有不同数据类型的数组设置整个列时:

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 默认值#

DataFrameDataFrameGroupByResampler 操作(如 minsumidxmax)中,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 参数。

其他弃用#

性能提升#

错误修复#

Categorical#

  • Categorical.view() 中的错误不接受整数数据类型 (GH 25464)

  • 当索引的类别是整数类型且索引包含 NaN 值时,CategoricalIndex.union() 中的错误会错误地引发而不是转换为 float64 (GH 45362)

  • 当连接两个(或更多)无序的 CategoricalIndex 变量,其类别是排列时,concat() 中的错误会产生不正确的索引值 (GH 24845)

Datetimelike#

  • DataFrame.quantile() 中,当使用类似日期时间的 dtypes 且没有行时,错误地返回 float64 dtype 而不是保留类似日期时间的 dtype (GH 41544)

  • to_datetime() 中存在一个错误,当处理 np.str_ 对象序列时会错误地引发 (GH 32264)

  • 当将日期时间组件作为位置参数传递,并将 tzinfo 作为关键字参数传递时,Timestamp 构造中的错误不正确地引发 (GH 31929)

  • 当从对象 dtype 转换为 timedelta64[ns] dtype 时,Index.astype() 中的错误错误地将 np.datetime64("NaT") 值转换为 np.timedelta64("NaT") 而不是引发 (GH 45722)

  • 在传递分类列时 SeriesGroupBy.value_counts() 索引中的错误 (GH 44324)

  • DatetimeIndex.tz_localize() 中本地化到 UTC 时未能复制底层数据的问题 (GH 46460)

  • DatetimeIndex.resolution() 中的错误错误地返回“天”而不是“纳秒”,用于纳秒分辨率索引 (GH 46903)

  • Timestamp 中存在一个错误,当使用整数或浮点数值和 unit="Y"unit="M" 时,结果略有错误 (GH 47266)

  • 当传递另一个 DatetimeArray 并且 freq=None 时,DatetimeArray 构造中的错误,错误地从给定数组推断 freq (GH 47296)

  • to_datetime() 中的一个错误,即使 errors=coerce ,如果超过50行,会抛出 OutOfBoundsDatetime (GH 45319)

  • 在将 DateOffset 添加到 Series 时出现错误,不会添加 nanoseconds 字段 (GH 47856)

Timedelta#

  • astype_nansafe() 中的错误:当包含 np.nan 时,astype(“timedelta64[ns]”) 失败 (GH 45798)

  • 在用 np.timedelta64 对象和 unit 构建 Timedelta 时存在一个错误,有时会静默溢出并返回不正确的结果,而不是引发 OutOfBoundsTimedelta (GH 46827)

  • 在从大整数或带有 unit="W" 的浮点数构造 Timedelta 时存在一个错误,它会静默溢出并返回不正确的结果,而不是引发 OutOfBoundsTimedelta (GH 47268)

时区#

  • 在传递 ZoneInfo tzinfo 对象时,Timestamp 构造函数引发的错误 (GH 46425)

Numeric#

  • 在使用 dtype="boolean"NA 进行数组类似操作时,错误地就地修改数组的问题 (GH 45421)

  • 在可空类型中没有 NA 值的算术运算存在错误,与非可空类型的相同运算不匹配 (GH 48223)

  • floordiv 中,当除以 IntegerDtype 0 时会返回 0 而不是 inf (GH 48223)

  • dtype="boolean" 的类数组对象上进行 powmod 操作时出现的错误,不像它们的 np.bool_ 对应物 (GH 46063)

  • 在将具有 IntegerDtypeFloatingDtypeSeries 与具有 timedelta64[ns] dtype 的类数组对象相乘时,错误地引发了一个 Bug (GH 45622)

  • mean() 中的一个错误,其中可选依赖 bottleneck 导致数组长度线性增加的精度损失。bottleneck 已禁用以改进 mean() 的损失为对数线性,但可能会导致性能下降。(GH 42878)

转换#

字符串#

Interval#

  • 在将 np.nan 设置到整数支持的数组中时,IntervalArray.__setitem__() 中的错误引发 ValueError 而不是 TypeError (GH 45484)

  • 在使用 datetime64[ns, tz] 作为 dtype 字符串时 IntervalDtype 中的 Bug (GH 46999)

索引#

  • DataFrame.iloc() 中的一个错误,当在一个包含单个 ExtensionDtype 列的 DataFrame 上索引单行时,返回的是一个副本而不是底层数据的视图 (GH 45241)

  • DataFrame.__getitem__() 中存在一个错误,即使选择了唯一列,当 DataFrame 有重复列时返回副本 (GH 45316, GH 41062)

  • Series.align() 中的错误不会在两个 MultiIndexes 交集相同时创建具有级别并集的 MultiIndex (GH 45224)

  • 在将 NA 值(Nonenp.nan)设置到具有基于 int 的 IntervalDtypeSeries 中时,错误地转换为 object dtype,而不是基于 float 的 IntervalDtype (GH 45568)

  • ExtensionDtype 列中使用 df.iloc[:, i] = values 设置索引值的错误,其中 valuesdf.iloc[:, i] 具有相同的 dtype,错误地插入了一个新数组而不是就地设置 (GH 33457)

  • 在使用整数键设置无法就地设置的值时,当使用非整数 IndexSeries.__setitem__() 中存在错误,应引发 ValueError 而不是转换为通用 dtype (GH 45070)

  • DataFrame.loc() 中的错误,在将值作为列表设置到 DataFrame 中时,不会将 None 转换为 NA (GH 47987)

  • Series.__setitem__() 中设置不兼容的值到 PeriodDtypeIntervalDtype Series 时,当使用布尔掩码索引时会引发错误,但在使用其他等效索引器时会强制转换;现在这些情况一致地强制转换,包括 Series.mask()Series.where() (GH 45768)

  • 在具有类似日期时间的多列的 DataFrame.where() 中存在一个错误,无法将结果向下转换为与其他数据类型一致 (GH 45837)

  • isin() 中,当使用无符号整数类型和没有类型的类列表参数时,会向上转换为 float64 的错误 (GH 46485)

  • 在未使用 MultiIndex 的情况下,使用多个键时,Series.loc.__setitem__()Series.loc.__getitem__() 中的错误未引发 (GH 13831)

  • 在指定了 level 但没有给出 MultiIndex 时,Index.reindex() 中的 Bug 引发了 AssertionError;现在忽略 level (GH 35132)

  • 当为一个 Series 数据类型设置一个过大的值时,未能强制转换为通用类型的问题 (GH 26049, GH 32878)

  • loc.__setitem__() 中的错误,将 range 键作为位置处理而不是基于标签处理 (GH 45479)

  • DataFrame.__setitem__() 中存在一个错误,当使用标量键和 DataFrame 作为值时,会将扩展数组的数据类型转换为对象 (GH 46896)

  • 在设置标量到可空 pandas 数据类型时,Series.__setitem__() 中的错误不会在标量无法(无损地)转换为可空类型时引发 TypeError (GH 45404)

  • 在设置包含 NAboolean 数据类型值时,Series.__setitem__() 中的错误不正确地引发,而不是转换为 boolean 数据类型 (GH 45462)

  • Index 不匹配时,包含 NA 的布尔索引器引发 Series.loc() 的错误 (GH 46551)

  • Series.__setitem__() 中的一个错误,当设置 NA 到一个数值类型的 Series 时,会错误地向上转换为对象类型,而不是将值视为 np.nan (GH 44199)

  • 当设置值到一列且右侧是一个字典时,DataFrame.loc() 中的错误 (GH 47216)

  • Series.__setitem__() 中存在一个错误,当使用 datetime64[ns] 数据类型、全为 False 的布尔掩码和不兼容的值时,错误地转换为 object 类型,而不是保留 datetime64[ns] 数据类型 (GH 45967)

  • 在索引器来自带有 NA 的布尔类型时,Index.__getitem__() 中的错误引发 ValueError (GH 45806)

  • 在通过标量扩展 Series 时,Series.__setitem__() 中的错误导致精度丢失 (GH 32346)

  • Series.mask() 中使用 inplace=True 或在用布尔掩码设置小整数类型值时错误地引发 (GH 45750)

  • inplace=TrueExtensionDtype 列的情况下,DataFrame.mask() 中的错误不正确地引发 (GH 45577)

  • 在使用具有类似日期时间值的对象类型行索引从 DataFrame 获取列时存在错误:生成的 Series 现在保留了父 DataFrame 中的确切对象类型索引 (GH 42950)

  • DataFrame.__getattribute__() 中存在一个错误,如果列具有 "string" dtype,则会引发 AttributeError (GH 46185)

  • 在比较扩展数组类型和numpy类型时,DataFrame.compare() 返回所有 NaN 列的错误 (GH 44014)

  • DataFrame.where() 中使用 "boolean" 掩码为 numpy 数据类型设置错误值的错误 (GH 44014)

  • DatetimeIndex 上使用 np.str_ 键进行索引时错误地引发 (GH 45580)

  • 当索引包含 NaN 值时,CategoricalIndex.get_indexer() 中的错误,导致在目标中但不在索引中的元素被映射到 NaN 元素的索引,而不是 -1 (GH 45361)

  • 在将大整数值设置到具有 float32float16 dtype 的 Series 中时,错误地更改了这些值,而不是强制转换为 float64 dtype (GH 45844)

  • Series.asof()DataFrame.asof() 中的错误不正确地将布尔类型结果转换为 float64 类型 (GH 16063)

  • NDFrame.xs()DataFrame.iterrows()DataFrame.loc()DataFrame.iloc() 中的错误不会总是传播元数据 (GH 28283)

  • DataFrame.sum() 中的错误:如果输入包含 NaNs,min_count 会更改 dtype (GH 46947)

  • IntervalTree 中导致无限递归的错误。(GH 46658)

  • PeriodIndex 在索引 NA 时引发 AttributeError ,而不是在其位置放置 NaT 的错误。(GH 46673)

  • DataFrame.at() 中的错误允许修改多个列 (GH 48296)

缺失#

MultiIndex#

I/O#

周期#

  • PeriodPeriodArray 中减去时返回错误结果的错误 (GH 45999)

  • Period.strftime()PeriodIndex.strftime() 中的错误,指令 %l%u 给出了错误的结果 (GH 46252)

  • 当传递一个字符串给 Period 微秒时,推断出错误的 freq 的 Bug,这些微秒是1000的倍数 (GH 46811)

  • 从具有非零纳秒的 Timestampnp.datetime64 对象构造 Period 时,使用 freq="ns" 错误地截断纳秒 (GH 46811)

  • 在将 np.timedelta64("NaT", "ns") 添加到一个带有类似 timedelta 频率的 Period 时,错误地引发 IncompatibleFrequency 而不是返回 NaT (GH 47196)

  • 在将一个整数数组添加到一个包含 PeriodDtype 的数组时,当 dtype.freq.n > 1 时结果不正确 (GH 47209)

  • 在从一个包含 PeriodDtype 的数组中减去 Period 时,当操作溢出时返回不正确的结果而不是引发 OverflowError 的错误 (GH 47538)

绘图#

分组/重采样/滚动#

重塑#

Sparse#

ExtensionArray#

  • IntegerArray.searchsorted()FloatingArray.searchsorted() 中的错误,在处理 np.nan 时返回不一致的结果 (GH 45255)

Styler#

  • 尝试对空DataFrame子集应用样式功能时出现错误 (GH 45313)

  • CSSToExcelConverter 中的错误导致在使用 xlsxwriter 引擎时,提供边框颜色但没有边框样式会导致 TypeError (GH 42276)

  • Styler.set_sticky() 中的错误导致在暗模式下出现白色文字在白色背景上 (GH 46984)

  • Styler.to_latex() 中的错误导致当 clines="all;data"DataFrame 没有行时出现 UnboundLocalError。 (GH 47203)

  • 在使用 xlsxwriter 引擎时,当使用 vertical-align: middle; 时,Styler.to_excel() 中的 Bug (GH 30107)

  • 当对带有布尔列标签的 DataFrame 应用样式时出现错误 (GH 47838)

元数据#

其他#

贡献者#

共有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 +