1.0.0 的新增功能(2020 年 1 月 29 日)#

这些是 pandas 1.0.0 中的变化。请参阅发行说明以获取完整的变更日志,包括其他版本的 pandas。

笔记

pandas 1.0 版本删除了许多以前版本中已弃用的功能(请参阅下面的 概述)。建议首先升级到 pandas 0.25 并确保您的代码在升级到 pandas 1.0 之前可以正常运行且不会出现警告。

新的弃用政策#

从pandas 1.0.0开始,pandas将采用SemVer的变体来进行版本发布。简要地,

  • 弃用将在次要版本中引入(例如 1.1.0、1.2.0、2.1.0,...)

  • 弃用将在主要版本中强制执行(例如 1.0.0、2.0.0、3.0.0,...)

  • 仅在主要版本中才会进行 API 破坏性更改(实验性功能除外)

有关更多信息,请参阅版本政策

增强功能#

rolling.apply在and #中使用 Numbaexpanding.apply

我们添加了一个engine关键字apply()apply() ,允许用户使用Numba而不是 Cython 执行例程。如果 apply 函数可以在 numpy 数组上运行并且数据集更大(100 万行或更多),那么使用 Numba 引擎可以显着提高性能。有关更多详细信息,请参阅 滚动应用文档GH 28987GH 30936

定义滚动操作的自定义窗口#

我们添加了一个pandas.api.indexers.BaseIndexer()类,允许用户定义在rolling操作期间如何创建窗口边界。用户可以在子类上定义自己的get_window_bounds 方法pandas.api.indexers.BaseIndexer(),该方法将生成滚动聚合期间用于每个窗口的开始和结束索引。有关更多详细信息和示例用法,请参阅自定义窗口滚动文档

转换为Markdown#

我们添加了to_markdown()用于创建Markdown表(GH 11052

In [1]: df = pd.DataFrame({"A": [1, 2, 3], "B": [1, 2, 3]}, index=['a', 'a', 'b'])

In [2]: print(df.to_markdown())
|    |   A |   B |
|:---|----:|----:|
| a  |   1 |   1 |
| a  |   2 |   2 |
| b  |   3 |   3 |

实验性新功能#

NA表示缺失值的实验标量#

引入了一个新pd.NA值(单例)来表示标量缺失值。到目前为止,pandas 使用多个值来表示缺失的数据:np.nan用于浮点数据、np.nan对象 None数据类型数据和pd.NaT类似日期时间的数据。目标pd.NA是提供一个可以跨数据类型一致使用的“缺失”指标。目前由可空整数和布尔数据类型以及新的字符串数据类型( GH 28095pd.NA )使用。

警告

实验性: 的行为pd.NA仍然可以在没有警告的情况下发生变化。

例如,使用可为空整数数据类型创建一个 Series:

In [3]: s = pd.Series([1, 2, None], dtype="Int64")

In [4]: s
Out[4]: 
0       1
1       2
2    <NA>
dtype: Int64

In [5]: s[2]
Out[5]: <NA>

与 相比np.nanpd.NA在某些操作中的行为有所不同。除了算术运算之外,pd.NA还在比较运算中传播为“缺失”或“未知”:

In [6]: np.nan > 1
Out[6]: False

In [7]: pd.NA > 1
Out[7]: <NA>

对于逻辑运算,遵循三值逻辑(或 克林逻辑pd.NA)的规则 。例如:

In [8]: pd.NA | True
Out[8]: True

有关详细信息,请参阅用户指南中有关缺失数据的NA 部分。

专用字符串数据类型#

我们添加了StringDtype专用于字符串数据的扩展类型。以前,字符串通常存储在对象数据类型 NumPy 数组中。 (GH 29975

警告

StringDtype目前被认为是实验性的。 API 的实现和部分可能会在没有警告的情况下发生更改。

扩展类型'string'解决了对象数据类型 NumPy 数组的几个问题:

  1. 您可能会意外地将字符串和非字符串 混合object存储在dtype 数组中。 AStringArray只能存储字符串。

  2. objectdtype 会破坏特定于 dtype 的操作,例如DataFrame.select_dtypes().没有明确的方法来选择文本,同时排除非文本,但仍然是对象数据类型列。

  3. 阅读代码时,dtype 数组的内容object不如string.

In [9]: pd.Series(['abc', None, 'def'], dtype=pd.StringDtype())
Out[9]: 
0     abc
1    <NA>
2     def
dtype: string

"string"您也可以使用别名。

In [10]: s = pd.Series(['abc', None, 'def'], dtype="string")

In [11]: s
Out[11]: 
0     abc
1    <NA>
2     def
dtype: string

通常的字符串访问器方法可以工作。在适当的情况下,DataFrame 的 Series 或列的返回类型也将具有字符串数据类型。

In [12]: s.str.upper()
Out[12]: 
0     ABC
1    <NA>
2     DEF
dtype: string

In [13]: s.str.split('b', expand=True).dtypes
Out[13]: 
0    string[python]
1    string[python]
dtype: object

返回整数的字符串访问器方法将返回一个值Int64Dtype

In [14]: s.str.count("a")
Out[14]: 
0       1
1    <NA>
2       0
dtype: Int64

我们建议string在处理字符串时显式使用数据类型。有关详细信息,请参阅文本数据类型

支持缺失值的布尔数据类型#

我们添加了BooleanDtype/ BooleanArray,这是一种专用于可以保存缺失值的布尔数据的扩展类型。默认 bool数据类型基于 bool-dtype NumPy 数组,该列只能保存 TrueFalse,并且不能保存缺失值。这个新功能BooleanArray 还可以通过在单独的掩码中跟踪缺失值来存储缺失值。 (GH 29555GH 30095GH 31131

In [15]: pd.Series([True, False, None], dtype=pd.BooleanDtype())
Out[15]: 
0     True
1    False
2     <NA>
dtype: boolean

"boolean"您也可以使用别名。

In [16]: s = pd.Series([True, False, None], dtype="boolean")

In [17]: s
Out[17]: 
0     True
1    False
2     <NA>
dtype: boolean

convert_dtypes简化使用支持的扩展数据类型的方法#

为了鼓励使用扩展 dtypes StringDtypeBooleanDtypeInt64DtypeInt32Dtype等,支持pd.NA、 方法DataFrame.convert_dtypes()Series.convert_dtypes() 已被引入。 (GH 29752)(GH 30929

例子:

In [18]: df = pd.DataFrame({'x': ['abc', None, 'def'],
   ....:                    'y': [1, 2, np.nan],
   ....:                    'z': [True, False, True]})
   ....: 

In [19]: df
Out[19]: 
      x    y      z
0   abc  1.0   True
1  None  2.0  False
2   def  NaN   True

In [20]: df.dtypes
Out[20]: 
x     object
y    float64
z       bool
dtype: object
In [21]: converted = df.convert_dtypes()

In [22]: converted
Out[22]: 
      x     y      z
0   abc     1   True
1  <NA>     2  False
2   def  <NA>   True

In [23]: converted.dtypes
Out[23]: 
x    string[python]
y             Int64
z           boolean
dtype: object

read_csv() 在使用和等读取器读取数据后,这尤其有用read_excel()。请参阅此处了解说明。

其他增强功能#

向后不兼容的 API 更改#

避免使用MultiIndex.levels#中的名称

作为更大重构的一部分,MultiIndex级别名称现在与级别分开存储(GH 27242)。我们建议使用 MultiIndex.names来访问名称并Index.set_names() 更新名称。

为了向后兼容,您仍然可以通过级别访问名称。

In [24]: mi = pd.MultiIndex.from_product([[1, 2], ['a', 'b']], names=['x', 'y'])

In [25]: mi.levels[0].name
Out[25]: 'x'

但是,无法再 通过关卡更新名称。MultiIndex

In [26]: mi.levels[0].name = "new name"
---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
Cell In[26], line 1
----> 1 mi.levels[0].name = "new name"

File ~/work/pandas/pandas/pandas/core/indexes/base.py:1690, in Index.name(self, value)
   1686 @name.setter
   1687 def name(self, value: Hashable) -> None:
   1688     if self._no_setting_name:
   1689         # Used in MultiIndex.levels to avoid silently ignoring name updates.
-> 1690         raise RuntimeError(
   1691             "Cannot set name on a level of a MultiIndex. Use "
   1692             "'MultiIndex.set_names' instead."
   1693         )
   1694     maybe_extract_name(value, None, type(self))
   1695     self._name = value

RuntimeError: Cannot set name on a level of a MultiIndex. Use 'MultiIndex.set_names' instead.

In [27]: mi.names
Out[27]: FrozenList(['x', 'y'])

要更新,请使用MultiIndex.set_names,它返回一个新的MultiIndex.

In [28]: mi2 = mi.set_names("new name", level=0)

In [29]: mi2.names
Out[29]: FrozenList(['new name', 'y'])

#的新代表IntervalArray

pandas.arrays.IntervalArray__repr__根据其他数组类采用新的( GH 25022

熊猫 0.25.x

In [1]: pd.arrays.IntervalArray.from_tuples([(0, 1), (2, 3)])
Out[2]:
IntervalArray([(0, 1], (2, 3]],
              closed='right',
              dtype='interval[int64]')

熊猫1.0.0

In [30]: pd.arrays.IntervalArray.from_tuples([(0, 1), (2, 3)])
Out[30]: 
<IntervalArray>
[(0, 1], (2, 3]]
Length: 2, dtype: interval[int64, right]

DataFrame.rename现在只接受一个位置参数#

DataFrame.rename()之前会接受会导致不明确或未定义行为的位置参数。从 pandas 1.0 开始,只有第一个参数(将标签沿默认轴映射到其新名称)才允许按位置传递(GH 29136)。

熊猫 0.25.x

In [1]: df = pd.DataFrame([[1]])
In [2]: df.rename({0: 1}, {0: 2})
Out[2]:
FutureWarning: ...Use named arguments to resolve ambiguity...
   2
1  1

熊猫1.0.0

In [3]: df.rename({0: 1}, {0: 2})
Traceback (most recent call last):
...
TypeError: rename() takes from 1 to 2 positional arguments but 3 were given

请注意,当提供冲突或可能不明确的参数时,现在会引发错误。

熊猫 0.25.x

In [4]: df.rename({0: 1}, index={0: 2})
Out[4]:
   0
1  1

In [5]: df.rename(mapper={0: 1}, index={0: 2})
Out[5]:
   0
2  1

熊猫1.0.0

In [6]: df.rename({0: 1}, index={0: 2})
Traceback (most recent call last):
...
TypeError: Cannot specify both 'mapper' and any of 'index' or 'columns'

In [7]: df.rename(mapper={0: 1}, index={0: 2})
Traceback (most recent call last):
...
TypeError: Cannot specify both 'mapper' and any of 'index' or 'columns'

您仍然可以通过提供关键字参数来更改应用第一个位置参数的轴axis

In [31]: df.rename({0: 1})
Out[31]: 
   0
1  1

In [32]: df.rename({0: 1}, axis=1)
Out[32]: 
   1
0  1

如果您想同时更新索引和列标签,请务必使用相应的关键字。

In [33]: df.rename(index={0: 1}, columns={0: 2})
Out[33]: 
   2
1  1

# 的扩展详细信息输出DataFrame

DataFrame.info()现在显示列摘要的行号(GH 17304

熊猫 0.25.x

In [1]: df = pd.DataFrame({"int_col": [1, 2, 3],
...                    "text_col": ["a", "b", "c"],
...                    "float_col": [0.0, 0.1, 0.2]})
In [2]: df.info(verbose=True)
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3 entries, 0 to 2
Data columns (total 3 columns):
int_col      3 non-null int64
text_col     3 non-null object
float_col    3 non-null float64
dtypes: float64(1), int64(1), object(1)
memory usage: 152.0+ bytes

熊猫1.0.0

In [34]: df = pd.DataFrame({"int_col": [1, 2, 3],
   ....:                    "text_col": ["a", "b", "c"],
   ....:                    "float_col": [0.0, 0.1, 0.2]})
   ....: 

In [35]: df.info(verbose=True)
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3 entries, 0 to 2
Data columns (total 3 columns):
 #   Column     Non-Null Count  Dtype  
---  ------     --------------  -----  
 0   int_col    3 non-null      int64  
 1   text_col   3 non-null      object 
 2   float_col  3 non-null      float64
dtypes: float64(1), int64(1), object(1)
memory usage: 200.0+ bytes

pandas.array()推理变化#

pandas.array()现在在几种情况下推断 pandas 的新扩展类型(GH 29791):

  1. 字符串数据(包括缺失值)现在返回一个arrays.StringArray.

  2. 整数数据(包括缺失值)现在返回一个arrays.IntegerArray.

  3. 布尔数据(包括缺失值)现在返回新的arrays.BooleanArray

熊猫 0.25.x

In [1]: pd.array(["a", None])
Out[1]:
<PandasArray>
['a', None]
Length: 2, dtype: object

In [2]: pd.array([1, None])
Out[2]:
<PandasArray>
[1, None]
Length: 2, dtype: object

熊猫1.0.0

In [36]: pd.array(["a", None])
Out[36]: 
<StringArray>
['a', <NA>]
Length: 2, dtype: string

In [37]: pd.array([1, None])
Out[37]: 
<IntegerArray>
[1, <NA>]
Length: 2, dtype: Int64

提醒一下,您可以指定dtype来禁用所有推理。

arrays.IntegerArray现在使用#pandas.NA

arrays.IntegerArray现在使用pandas.NA而不是 numpy.nan作为其缺失值标记(GH 29964)。

熊猫 0.25.x

In [1]: a = pd.array([1, 2, None], dtype="Int64")
In [2]: a
Out[2]:
<IntegerArray>
[1, 2, NaN]
Length: 3, dtype: Int64

In [3]: a[2]
Out[3]:
nan

熊猫1.0.0

In [38]: a = pd.array([1, 2, None], dtype="Int64")

In [39]: a
Out[39]: 
<IntegerArray>
[1, 2, <NA>]
Length: 3, dtype: Int64

In [40]: a[2]
Out[40]: <NA>

这会造成一些 API 破坏的后果。

转换为 NumPy ndarray

转换为 NumPy 数组时,缺失值将为pd.NA,无法转换为浮点数。所以 现在跟注将会加注。np.asarray(integer_array, dtype="float")

熊猫 0.25.x

In [1]: np.asarray(a, dtype="float")
Out[1]:
array([ 1.,  2., nan])

熊猫1.0.0

In [41]: np.asarray(a, dtype="float")
Out[41]: array([ 1.,  2., nan])

arrays.IntegerArray.to_numpy()而是与显式一起使用na_value

In [42]: a.to_numpy(dtype="float", na_value=np.nan)
Out[42]: array([ 1.,  2., nan])

减价可以退货 pd.NA

当执行归约(例如与 求和)时skipna=False,结果现在将不是pd.NA存在np.nan缺失值(GH 30958)。

熊猫 0.25.x

In [1]: pd.Series(a).sum(skipna=False)
Out[1]:
nan

熊猫1.0.0

In [43]: pd.Series(a).sum(skipna=False)
Out[43]: <NA>

value_counts 返回可为 null 的整数 dtype

Series.value_counts()具有可为空整数 dtype 的现在返回值的可为空整数 dtype。

熊猫 0.25.x

In [1]: pd.Series([2, 1, 1, None], dtype="Int64").value_counts().dtype
Out[1]:
dtype('int64')

熊猫1.0.0

In [44]: pd.Series([2, 1, 1, None], dtype="Int64").value_counts().dtype
Out[44]: Int64Dtype()

有关 和之间差异的更多信息,请参阅NA 语义pandas.NAnumpy.nan

arrays.IntegerArray比较返回#arrays.BooleanArray

a 上的比较操作arrays.IntegerArray现在返回 a arrays.BooleanArray而不是 NumPy 数组 ( GH 29964 )。

熊猫 0.25.x

In [1]: a = pd.array([1, 2, None], dtype="Int64")
In [2]: a
Out[2]:
<IntegerArray>
[1, 2, NaN]
Length: 3, dtype: Int64

In [3]: a > 1
Out[3]:
array([False,  True, False])

熊猫1.0.0

In [45]: a = pd.array([1, 2, None], dtype="Int64")

In [46]: a > 1
Out[46]: 
<BooleanArray>
[False, True, <NA>]
Length: 3, dtype: boolean

请注意,缺失值现在会传播,而不是总是像 那样比较不相等numpy.nan。有关更多信息,请参阅NA 语义

默认情况下Categorical.min()现在返回最小值而不是 np.nan #

Categoricalcontains时np.nanCategorical.min()不再np.nan默认返回 (skipna=True) ( GH 25303 )

熊猫 0.25.x

In [1]: pd.Categorical([1, 2, np.nan], ordered=True).min()
Out[1]: nan

熊猫1.0.0

In [47]: pd.Categorical([1, 2, np.nan], ordered=True).min()
Out[47]: 1

默认数据类型为空#pandas.Series

pandas.Series在不指定 dtype 的情况下初始化空将引发DeprecationWarningnow ( GH 17261 )。在未来的版本中,默认数据类型将从 更改为 ,float64以便objectDataFrame和的行为保持一致Index

熊猫1.0.0

In [1]: pd.Series()
Out[2]:
DeprecationWarning: The default dtype for empty Series will be 'object' instead of 'float64' in a future version. Specify a dtype explicitly to silence this warning.
Series([], dtype: float64)

重新采样操作的结果数据类型推断发生变化#

聚合中结果 dtype 的规则DataFrame.resample()已针对扩展类型进行了更改 ( GH 31359 )。以前,pandas 会尝试将结果转换回原始数据类型,如果不可能,则返回到通常的推理规则。现在,如果结果中的标量值是扩展 dtype 标量类型的实例,pandas 将仅返回原始 dtype 的结果。

In [48]: df = pd.DataFrame({"A": ['a', 'b']}, dtype='category',
   ....:                   index=pd.date_range('2000', periods=2))
   ....: 

In [49]: df
Out[49]: 
            A
2000-01-01  a
2000-01-02  b

熊猫 0.25.x

In [1]> df.resample("2D").agg(lambda x: 'a').A.dtype
Out[1]:
CategoricalDtype(categories=['a', 'b'], ordered=False)

熊猫1.0.0

In [50]: df.resample("2D").agg(lambda x: 'a').A.dtype
Out[50]: CategoricalDtype(categories=['a', 'b'], ordered=False, categories_dtype=object)

resample这修复了和之间的不一致groupby。这还修复了一个潜在的错误,即结果的可能会根据结果转换回原始数据类型的方式而发生变化。

熊猫 0.25.x

In [1] df.resample("2D").agg(lambda x: 'c')
Out[1]:

     A
0  NaN

熊猫1.0.0

In [51]: df.resample("2D").agg(lambda x: 'c')
Out[51]: 
            A
2000-01-01  c

增加了 Python 的最低版本#

pandas 1.0.0 支持 Python 3.6.1 及更高版本 ( GH 29212 )。

增加了依赖项的最低版本#

更新了一些依赖项的最低支持版本(GH 29766GH 2972​​3)。如果安装了,我们现在需要:

包裹

最低版本

必需的

改变了

麻木

1.13.3

X

皮茨

2015.4

X

python-dateutil

2.6.1

X

瓶颈

1.2.1

数值表达式

2.6.2

pytest(开发)

4.0.2

对于可选库,一般建议使用最新版本。下表列出了当前在 pandas 开发过程中测试的每个库的最低版本。低于最低测试版本的可选库可能仍然有效,但不被视为受支持。

包裹

最低版本

改变了

美丽汤4

4.6.0

快速镶木地板

0.3.2

X

GCSFS

0.2.2

lxml

3.8.0

绘图库

2.2.2

努巴

0.46.0

X

开放式pyxl

2.5.7

X

皮箭头

0.13.0

X

pymysql

0.7.1

pytables

3.4.2

s3fs

0.3.0

X

scipy

0.19.0

sqlalchemy

1.1.4

阵列

0.8.2

xlrd

1.1.0

XLSX作家

0.9.8

xlwt

1.2.0

有关更多信息,请参阅依赖项可选依赖项

构建更改#

pandas 添加了pyproject.toml文件,并且将不再在上传到 PyPI 的源发行版中包含 cythonized 文件(GH 28341GH 20775)。如果您正在安装内置发行版(轮子)或通过 conda,这应该不会对您产生任何影响。如果您从源代码构建 pandas,则在调用.pip install pandas

其他 API 更改#

  • DataFrameGroupBy.transform()现在SeriesGroupBy.transform()引发无效操作名称(GH 27489

  • pandas.api.types.infer_dtype()现在将返回整数和np.nan混合的“integer-na”(GH 27283

  • MultiIndex.from_arrays()names=None如果明确提供,将不再从数组推断名称( GH 27292

  • 为了改进制表符补全,pandas 在使用dir(例如dir(df))内省 pandas 对象时不包含大多数已弃用的属性。要查看排除了哪些属性,请查看对象的_deprecations属性,例如pd.DataFrame._deprecations( GH 28805 )。

  • 现在返回的数据类型unique()与输入数据类型匹配。 (GH 27874

  • 将默认配置值从 更改options.matplotlib.register_convertersTrue( "auto"GH 18720 )。现在,pandas 自定义格式化程序将仅应用于 pandas 通过plot().以前,pandas 的格式化程序将应用于.pandas之后plot()创建的所有绘图。有关更多信息,请参阅单位注册

  • Series.dropna()放弃了它的**kwargs论点,转而支持单个how参数。提供除之前how提出**kwargs的任何其他内容TypeError( GH 29388 )

  • 测试 pandas 时,新的 pytest 最低版本要求是 5.0.1 ( GH 29664 )

  • Series.str.__iter__()已弃用并将在未来版本中删除 ( GH 28277 )。

  • 添加到( GH 30821 )<NA>的默认 NA 值列表中read_csv()

文档改进#

弃用#

  • Series.item()Index.item()已_未弃用_ ( GH 29250 )

  • Index.set_value已被弃用。对于给定的索引idx,数组arr,值idxidx_val新值val, 相当于,应该使用它(GH 28621)。idx.set_value(arr, idx_val, val)arr[idx.get_loc(idx_val)] = val

  • is_extension_type()已弃用,is_extension_array_dtype()应改用 ( GH 29457 )

  • eval()关键字参数“truediv”已弃用,并将在未来版本中删除(GH 29812

  • DateOffset.isAnchored()DatetOffset.onOffset()弃用,并将在未来版本中删除,请使用DateOffset.is_anchored()andDateOffset.is_on_offset()代替 ( GH 30340 )

  • pandas.tseries.frequencies.get_offset已弃用并将在未来版本中删除,请改用pandas.tseries.frequencies.to_offset( GH 4205 )

  • Categorical.take_nd()CategoricalIndex.take_nd()已弃用,请使用Categorical.take()CategoricalIndex.take()代替 ( GH 27745 )

  • numeric_only的参数已弃用并替换为( GH 25303 )Categorical.min()Categorical.max()skipna

  • label中的参数lreshape()已被弃用,并将在未来版本中删除(GH 29742

  • pandas.core.index已被弃用并将在未来版本中删除,公共类在顶级命名空间中可用(GH 19711

  • pandas.json_normalize()现在暴露在顶级命名空间中。现在不推荐使用json_normalizeas pandas.io.json.json_normalize,建议使用json_normalizeaspandas.json_normalize()代替 ( GH 27586 )。

  • numpy的参数已pandas.read_json()弃用(GH 28512)。

  • DataFrame.to_stata()DataFrame.to_feather()DataFrame.to_parquet()参数“fname”已弃用,请使用“path”代替(GH 23574

  • 已弃用的内部属性_start,现在提出 a_stop而不是 a ( GH 26581 )_stepRangeIndexFutureWarningDeprecationWarning

  • pandas.util.testing模块已被弃用。使用断言函数( GH 16232pandas.testing ) 中记录的公共 API 。

  • pandas.SparseArray已被弃用。使用pandas.arrays.SparseArray( arrays.SparseArray) 代替。 (GH 30642

  • is_copyand参数已被弃用Series.take()DataFrame.take()并将在未来版本中删除。 (GH 27357

  • 对 a 的多维索引(例如)的支持已被弃用,并将在未来版本中删除,在索引之前转换为 numpy 数组(GH 30588index[:, None]Index

  • pandas.np子模块现已弃用。直接导入 numpy ( GH 30296 )

  • 该类pandas.datetime现已弃用。改为导入datetime( GH 30610 )

  • diffTypeError将来会引发而不是隐式丢失扩展类型的 dtype 。在调用之前转换为正确的数据类型diffGH 31025

从分组数据框中选择列

从对象中选择列时DataFrameGroupBy,不推荐在单括号内传递单个键(或键元组),而应使用项目列表。 ( GH 23566 ) 例如:

df = pd.DataFrame({
    "A": ["foo", "bar", "foo", "bar", "foo", "bar", "foo", "foo"],
    "B": np.random.randn(8),
    "C": np.random.randn(8),
})
g = df.groupby('A')

# single key, returns SeriesGroupBy
g['B']

# tuple of single key, returns SeriesGroupBy
g[('B',)]

# tuple of multiple keys, returns DataFrameGroupBy, raises FutureWarning
g[('B', 'C')]

# multiple keys passed directly, returns DataFrameGroupBy, raises FutureWarning
# (implicitly converts the passed strings into a single tuple)
g['B', 'C']

# proper way, returns DataFrameGroupBy
g[['B', 'C']]

删除先前版本的弃用/更改#

删除了 SparseSeries 和 SparseDataFrame

SparseSeriesSparseDataFrame并且该DataFrame.to_sparse方法已被删除(GH 28425)。我们建议改为使用 aSeriesDataFrame与稀疏值。

Matplotlib 单元注册

以前,pandas 会向 matplotlib 注册转换器,作为导入 pandas 的副作用(GH 18720)。这改变了导入 pandas 后通过 matplotlib 图绘制的图的输出,即使您直接使用 matplotlib 而不是plot().

要将 pandas 格式化程序与 matplotlib 图结合使用,请指定

In [1]: import pandas as pd
In [2]: pd.options.plotting.matplotlib.register_converters = True

DataFrame.plot()请注意,由和 所创建的绘图自动注册转换器。唯一的行为变化是通过 或绘制类似日期的对象时。有关更多信息,请参阅时间序列图的自定义格式化程序Series.plot() matplotlib.pyplot.plotmatplotlib.Axes.plot

其他搬迁

性能改进#

Bug修复

分类#

类似日期时间#

时间增量#

时区

数字#

转换

字符串#

间隔

索引#

  • 使用反向切片器进行分配时出现错误(GH 26939

  • DataFrame.explode()当索引中存在重复项时,错误会重复帧( GH 28010

  • PeriodIndex()使用包含Period( GH 28323 ) ( GH 28337 )的另一种类型的索引重新索引 a 时出现错误

  • .loc通过 numpy 非 ns 日期时间类型修复列分配( GH 27395

  • 转换为整数数据类型时未正确处理的Float64Index.astype()错误(GH 28475np.inf

  • Index.union()当左侧包含重复项时可能会失败(GH 28257

  • .loc使用非字符串类别的索引进行索引时出现错误CategoricalIndex不起作用(GH 17569GH 30225

  • Index.get_indexer_non_unique()在某些情况下可能会失败TypeError,例如在字符串索引中搜索整数时(GH 28257

  • 错误Float64Index.get_loc()地提高TypeError而不是KeyErrorGH 29189

  • DataFrame.loc()在 1 行 DataFrame 中设置分类值时,数据类型不正确(GH 25495

  • MultiIndex.get_loc()当输入包含缺失值时无法找到缺失值(GH 19132

  • Series.__setitem__()当新数据的长度True与值的数量匹配并且新数据不是 aSeries或 an 时,使用布尔索引器错误地分配值的错误np.array( GH 30567 )

  • 索引中的错误PeriodIndex错误地接受代表年份的整数,请使用 例如ser.loc["2007"]代替ser.loc[2007]( GH 30763 )

丢失的

多重索引#

  • 验证给MultiIndex定的构造函数是否与实际的if参数sortorder兼容(默认)(GH 28735lexsort_depthverify_integrityTrue

  • 如果级别中未给定标签,则系列和 MultiIndex.drop会引发异常( GH 8594MultiIndex

IO #

绘图#

GroupBy/重新采样/滚动#

重塑#

稀疏#

  • SparseDataFrame算术运算中的错误错误地将输入转换为浮点数( GH 28107

  • 当存在名为而不是访问器的列时DataFrame.sparse返回 a时出现错误( GH 30758Seriessparse

  • operator.xor()使用 boolean-dtype修复SparseArray。现在返回稀疏结果,而不是对象数据类型(GH 31025

扩展数组#

  • arrays.PandasArray设置标量字符串时出现错误( GH 28118GH 28150)。

  • 无法将可为 null 的整数与字符串进行比较的错误 ( GH 28930 )

  • DataFrame构造函数ValueError使用类似列表的数据引发并指定的错误dtypeGH 30280

其他

  • 尝试设置display.precision,display.max_rowsdisplay.max_columns使用set_option()除 aNone或正 int 之外的任何内容都会引发ValueError( GH 23348 )

  • 在嵌套字典中使用DataFrame.replace()重叠键将不再引发,现在匹配平面字典的行为(GH 27660

  • DataFrame.to_csv()现在Series.to_csv()支持字典作为compression参数,键'method'是压缩方法,当压缩方法是 时,其他作为附加压缩选项'zip'。 (GH 26023

  • Series.diff()布尔系列错误地引发 a 的错误TypeErrorGH 17294

  • Series.append()TypeError当传递一个元组时将不再引发Series( GH 28410 )

  • pandas.libs._json.encode()修复调用0d 数组时损坏的错误消息( GH 18878

  • 反引号DataFrame.query()现在DataFrame.eval()还可以用于使用无效标识符,例如以数字开头的名称、Python 关键字或使用单字符运算符。 (GH 27017

  • pd.core.util.hashing.hash_pandas_object包含元组的数组被错误地视为不可散列的错误( GH 28969

  • 附加空列表时DataFrame.append()引发的错误( GH 28769IndexError

  • 修复AbstractHolidayCalendar以返回 2030 年之后的正确结果(现在可达 2200)( GH 27790 )

  • 修复了IntegerArray返回inf而不是NaN除以的操作0GH 27398

  • 当其他值为or时的固定pow操作(GH 29997IntegerArray01

  • Series.count()如果启用 use_inf_as_na 则会引发错误( GH 29478

  • Index可以在不引发的情况下设置不可散列名称的错误TypeErrorGH 29069

  • DataFrame传递 2Dndarray和扩展 dtype时构造函数中的错误( GH 12513 )

  • 当提供带有 a和 a 的DataFrame.to_csv()系列时出现错误,被截断为 2 个字符。 (GH 29975dtype="string"na_repna_rep

  • BugDataFrame.itertuples()将错误地确定命名元组是否可用于 255 列的数据帧 ( GH 28282 )

  • 处理ExtensionArray 实现object中的嵌套 NumPy 数组( GH 30841 )testing.assert_series_equal()

  • 构造函数中的错误Index错误地允许二维输入数组(GH 13601GH 27125

贡献者#

共有 308 人为此版本贡献了补丁。名字带有“+”的人首次贡献了补丁。

  • 阿迪亚·帕尼卡斯 +

  • 阿卜杜拉·伊赫桑·塞塞尔

  • 阿比吉特·克里希南 +

  • 亚当·斯图尔特

  • 亚当·克劳姆 +

  • 艾迪森·林奇

  • 艾文戈 +

  • 阿拉斯泰尔·詹姆斯 +

  • 阿尔伯特·维拉诺瓦·德尔·莫拉尔

  • 亚历克斯·基尔科 +

  • 阿尔弗雷多·格兰哈 +

  • 艾伦·唐尼

  • 阿尔普阿里巴尔 +

  • 安德烈亚斯·布尔 +

  • 安德鲁·蒙克 +

  • 安迪

  • 安吉拉·安布罗兹 +

  • 阿尼鲁达·巴塔查吉 +

  • 安吉特·丹卡 +

  • 小安东尼奥·安德劳斯 +

  • 阿尔达·科萨尔 +

  • 阿西什·玛哈帕特拉 +

  • 奥斯汀·哈克特 +

  • 阿维·凯尔曼 +

  • 阿约沃勒T +

  • 巴斯·尼霍尔特 +

  • 本·塞耶

  • 巴拉特·拉古纳坦

  • 巴瓦尼·拉维

  • 布瓦纳 KA +

  • 大头

  • 布莱克·霍金斯 +

  • 金博培 +

  • 布雷特·瑙尔

  • 布赖恩·维格纳尔

  • 布鲁诺·P·木下 +

  • 布莱恩特·莫斯康 +

  • 塞萨尔 H+

  • 克里斯·斯塔德勒

  • 克里斯·齐默尔曼 +

  • 克里斯托弗·惠兰

  • 克莱门斯·布伦纳

  • 克莱门斯·托布姆 +

  • 康纳·查尔斯 +

  • 丹尼尔·汉克 +

  • 丹尼尔·萨克斯顿

  • 达林·普拉乔克 +

  • 戴夫·休斯

  • 大卫·斯坦斯比

  • 大卫·罗森 +

  • 院长+

  • 迪潘·达斯 +

  • 迪普亚曼·达塔

  • 多阿姆拉姆 +

  • 多萝西·卡巴罗兹 +

  • 德鲁·希南 +

  • 伊丽莎·梅·萨雷 +

  • 埃丽+

  • 恩德烈·马克·博尔扎 +

  • 埃里克·布拉塞尔 +

  • 埃里克·黄 +

  • 郑恩燮+

  • 艾登·维拉纽瓦 +

  • 菲利克斯·迪沃

  • 暂时 +

  • 弗朗西斯科·特鲁齐 +

  • 加布里埃尔·科罗纳 +

  • 加布里埃尔·蒙泰罗 +

  • 加鲁·萨希德 +

  • 格奥尔基·巴切夫 +

  • 吉娜

  • 朱帕萨雷利 +

  • 格里戈里奥斯·贾纳科普洛斯 +

  • 吉列尔梅·莱特 +

  • 吉列尔梅·莎乐美 +

  • 崔庆宰 +

  • 哈沙瓦尔丹·巴奇纳 +

  • 河村晴隆 +

  • 哈桑·基比里格

  • 希尔克·瓦林加

  • 休伯特

  • 休·凯利 +

  • 伊恩·伊夫斯 +

  • 伊格纳西奥·桑托林 +

  • 伊戈尔·菲利波夫 +

  • 欧夫·勒斯蒂格

  • 艾萨克·维尔舒普 +

  • 伊万·贝萨拉博夫 +

  • JMBurley +

  • 杰克·比克内尔 +

  • 雅各布·巴克海特 +

  • 简·科赫

  • 简·皮佩克 +

  • 扬·斯柯达 +

  • 扬·菲利普·格尔克

  • 贾斯珀·JF·范登博斯 +

  • Java+

  • 杰夫·雷巴克

  • 杰里米·申德尔

  • 杰伦·康德 +

  • 杰西·帕杜 +

  • 曹杰思 +

  • 江悦

  • 嘉祥+

  • 文智亨 +

  • 吉米·卡林

  • 周金洋 +

  • 若昂·维克托·马蒂内利 +

  • 乔克·阿米兰特+

  • 约翰·G·埃文斯 +

  • 约翰·沃德 +

  • 乔纳森·拉金 +

  • 乔里斯·范登博什

  • 乔什·迪马斯基 +

  • 约书亚·史密斯 +

  • 乔赛亚·贝克 +

  • 朱莉娅·西格内尔 +

  • 郑东浩 +

  • 贾斯汀·科尔 +

  • 贾斯汀·郑

  • 董凯琪

  • 卡蒂格延 +

  • 凯瑟琳·杨洛夫 +

  • 卡特琳·莱因韦伯

  • 陈纪宗 +

  • 基思·克劳斯 +

  • 凯文·阮 +

  • 凯文·谢泼德

  • 基塞卡·大卫 +

  • 库希克+

  • 凯尔·布​​恩 +

  • 凯尔·麦卡希尔 +

  • 劳拉·科拉德博士 +

  • 刘寻客+

  • 路易斯·黄 +

  • 卢卡斯·Scala托·阿斯图尔 +

  • 路易斯·古斯塔沃 +

  • 路加+

  • 卢克·谢泼德 +

  • 哈卢索娃 +

  • 梅贝尔·维拉尔巴

  • 马切杰·J +

  • 麦诗珍

  • 马努·纳莱帕 +

  • 马克

  • 马克·加西亚

  • 马可·戈雷利 +

  • 马可·诺依曼 +

  • 马丁·温克尔 +

  • 玛蒂娜·维拉斯 +

  • 马特乌斯+

  • 马修·罗斯克

  • 马修·谭 +

  • 马克斯·博林布鲁克

  • 陈麦克斯+

  • 米塞克斯机器

  • 米格尔+

  • 郑珉奎+

  • 穆罕默德·阿明·ZGHAL +

  • 莫希特·阿南德 +

  • 妈妈是最好的朋友 +

  • 娜奥米·邦宁 +

  • 内森·阿贝尔 +

  • 尼科·切尔内克 +

  • 奈杰尔·马基 +

  • 小林德忠 +

  • 奥克泰·萨巴克 +

  • 奥利弗·霍夫肯斯 +

  • 奥洛昆·阿德达约 +

  • 奥斯曼+

  • 奥古詹·奥雷登 +

  • 熊猫开发团队 +

  • 帕特里克·赫洛比尔 +

  • 保罗·李 +

  • 保罗·西格尔 +

  • 彼得·巴耶夫 +

  • 彼得罗·巴蒂斯顿

  • 普拉卡·潘迪 +

  • 普内斯 K+

  • 拉加夫+

  • 拉贾+

  • 拉杰汉斯·贾多 +

  • 拉吉夫·巴拉德瓦吉 +

  • 里克·德·科特 +

  • 罗伊尔

  • 罗希特·桑杰 +

  • 罗南·拉米 +

  • 罗什尼+

  • 罗伊姆普格+

  • 鲁沙布·瓦萨尼 +

  • 瑞恩·格鲁特 +

  • 瑞安·拿撒勒

  • 萨梅什·拉科蒂亚 +

  • 塞缪尔·西纳约科

  • 萨米亚克·耆那教 +

  • 莎拉·多尼豪威尔 +

  • 莎拉·马苏德 +

  • 索尔·沙纳布鲁克 +

  • 斯科特·科尔 +

  • SdgJlbl +

  • 塞布+

  • 谢尔盖·伊夫科 +

  • 沙迪·阿基基

  • 谢尔盖·肖罗霍夫

  • 西德什·波亚雷卡 +

  • 西达坦·奈尔 +

  • 西蒙·吉本斯

  • 西蒙·霍金斯

  • 西蒙·马丁·施罗德 +

  • 索菲安·马希乌 +

  • 苏拉夫·库马尔 +

  • 苏维克·曼达尔 +

  • 金素妍 +

  • 斯帕克尔·拉塞尔-普勒里 +

  • 斯里尼瓦斯·雷迪·塔蒂帕西 (శ్రీనివాస్ రెడ్డి తాటిపర్తి)

  • 斯图尔特·伯格+

  • 苏马瑙·萨林

  • 西蒙·贝德纳雷克 +

  • 坦贝·塔比莎·阿切尔 +

  • 谭陈

  • 唐和谊+

  • 坦美·达里巴 +

  • 坦尼娅·杰恩

  • 特尔吉·彼得森

  • 李托马斯+

  • 提尔·耆那教 +

  • 托拉A+

  • 汤姆·奥格斯普格

  • 汤米·林奇 +

  • 铃木智之 +

  • 托尼·洛伦佐

  • 无法处理+

  • 乌韦·科恩

  • 维巴夫·维沙尔

  • 维多利亚·兹丹诺夫斯卡娅 +

  • 维贾扬特+

  • 维什瓦克·斯里尼瓦桑 +

  • 王爱勇

  • 文焕

  • 韦斯·麦金尼

  • 威尔·艾德

  • 威尔·霍姆格伦

  • 威廉·艾德

  • 威廉·布兰 +

  • 沃特·奥弗迈尔

  • 乌劳拉·奥耶乌斯 +

  • 亚奥兹I+

  • 亚什·舒克拉 +

  • 王宇+

  • 田原佑圣 +

  • 亚历山大135 +

  • 阿里姆大师1

  • 阿夫琳格+

  • 神经节+

  • 博尔克德布鲁因

  • 勇敢+

  • 精惠+

  • 克鲁佐 +

  • 达尔加诺 +

  • 丹妮尔布朗+

  • 丹尼尔·普劳伦斯

  • est271 +

  • 弗朗西斯科·苏萨 +

  • 加内夫gv +

  • 加拉新闻+

  • 格菲扬

  • H-维蒂纳里

  • 哈斯奈因2808 +

  • 伊安祖尔 +

  • 贾布里特+

  • 杰布罗克门德尔

  • 杰什瓦尔 +

  • 贾兰博恩324 +

  • 乔伊-罗西 +

  • 内核

  • 逃亡杀手1

  • 克雷+

  • 莱克西-利新语 +

  • 露西莉奥+

  • 卢卡斯贝克+

  • 马赫什巴帕图 +

  • mck619+

  • 纳塔利尔

  • 纳文考希克2504 +

  • 尼勒普勒 +

  • 恩雷贝纳

  • 奥哈德83 +

  • 皮尔基文

  • pqzx +

  • 普罗斯特+

  • pv8493013j +

  • 曲达德+

  • 斯坦顿+

  • 鲁穆贾尔29 +

  • 桑加尔沙南 +

  • 萨多尼克+

  • 萨斯卡卡尔西 +

  • shaido987 +

  • 西克达尔1

  • 史蒂夫耶124 +

  • 正垣 +

  • 蒂姆塞拉+

  • 特莱顿谷歌+

  • 托比奶酪

  • tonywu1999 +

  • 茨维卡斯 +

  • 约根德拉索尼 +

  • zys5945+