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.ChunkedArraypyarrow.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 中渲染 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() 时是否将每个组添加到重采样(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。

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

  • 有关支持的数据类型(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

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

read_xml 现在支持 dtype, convertersparse_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 的 iterparseetree 的 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_writeGH 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
   ....: 

可以在此处找到更详细的解释。

其他增强功能#

显著的 bug 修复#

以下是可能导致显著行为变化的 bug 修复。

在分组变换中使用 dropna=True#

变换是一种其结果与输入大小相同的操作。当结果是 DataFrameSeries 时,还要求结果的索引与输入索引匹配。在 pandas 1.4 中,对分组中包含 null 值且设置了 dropna=TrueDataFrameGroupBy.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)

  • 使用 TimestampTimedelta 进行操作时,以前会引发 OverflowError,现在则会根据情况引发 OutOfBoundsDatetimeOutOfBoundsTimedelta。 (GH 47268)

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

  • DataFrame 构造函数在 indexcolumns 参数是集合时会引发错误 (GH 47215)

弃用#

警告

在下一个主要版本 2.0 中,正在考虑一些没有正式弃用通知的较大 API 变更,例如将标准库 zoneinfo 作为默认时区实现而非 pytz,让 Index 支持所有数据类型而不是拥有多个子类(CategoricalIndexInt64Index 等),等等。正在考虑的变更已记录在 此 GitHub issue 中,欢迎提出任何反馈或意见。

对拥有 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 来消除此警告并保留以前的行为。

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

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 参数。

其他弃用#

  • 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 数据与时区一起传递给 SeriesDatetimeIndex 时,将其视为 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.freqTimedelta.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)

  • 弃用 SeriesResampler 聚合器(例如 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)

  • 弃用 RollingExpandingExponentialMovingWindow 操作中的参数 *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() 中未使用的参数 encodingverbose (GH 47912)

  • 弃用 DataFrame.set_axis()Series.set_axis() 中的 inplace 关键字,请改用 obj = obj.set_axis(..., copy=False) (GH 48130)

  • 弃用迭代由长度为 1 的列表分组的 DataFrameGroupBySeriesGroupBy 时,产生单个元素的行为;将改回返回长度为 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)

性能改进#

错误修复#

分类#

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

  • 添加 DateOffsetSeries 中时存在错误,不会添加 nanoseconds 字段 (GH 47856)

时间差#

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

  • 构造 Timedelta 时存在错误,使用 np.timedelta64 对象和 unit 参数时有时会静默溢出并返回错误结果,而非引发 OutOfBoundsTimedelta 异常 (GH 46827)

  • 构造 Timedelta 时存在错误,使用带有 unit="W" 参数的大整数或浮点数时静默溢出并返回错误结果,而非引发 OutOfBoundsTimedelta 异常 (GH 47268)

时区#

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

数值#

  • 在与具有 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 的类数组对象时存在错误,错误地引发异常 (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)

字符串#

区间#

  • 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 值(Nonenp.nan)设置到具有基于整数的 IntervalDtypeSeries 中时存在错误,错误地转换为 object dtype 而非基于浮点数的 IntervalDtype (GH 45568)

  • 设置值时的索引错误,当使用 df.iloc[:, i] = values 将值设置到 ExtensionDtype 列中,且 valuesdf.iloc[:, i] 具有相同 dtype 时,错误地插入新数组而非就地设置 (GH 33457)

  • Series.__setitem__() 中存在错误,当 Index 为非整数类型,且使用整数键设置无法就地设置的值时,错误地引发了 ValueError 而非转换为通用 dtype (GH 45070)

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

  • Series.__setitem__() 中存在错误,当将不兼容的值设置到 PeriodDtypeIntervalDtype 类型的 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__() 中存在错误,当设置包含 NAboolean 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.__setitem__() 中存在错误,用标量扩展 Series 时丢失精度 (GH 32346)

  • 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 为 float32float16 时,这些值被错误地修改了,而不是强制转换为 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)

缺失值#

多级索引#

输入/输出#

周期#

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

  • Period.strftime()PeriodIndex.strftime() 中存在错误,指令 %l%u 返回错误结果 (GH 46252)

  • 推断错误的 freq 的错误,当向 Period 传递一个以 1000 微秒为倍数的字符串时 (GH 46811)

  • 从具有非零纳秒和 freq="ns"Timestampnp.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)

绘图#

分组/重采样/滚动#

重塑#

稀疏#

扩展数组#

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

元数据#

其他#

贡献者#

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