版本 0.22.0(2017 年 12 月 29 日)#

这是 0.21.1 的主要版本,包含一个 API 破坏性更改。我们建议所有用户在仔细阅读发行说明(单数!)后升级到此版本。

向后不兼容的 API 更改#

pandas 0.22.0 更改了空和全NA和与积的处理。总结就是

  • 空或全NA 的总和Series现在是0

  • 空或全NA 的乘积Series现在是1

  • 我们添加了一个min_count参数.sum().prod()控制有效值的最小数量以使结果有效。如果存在的min_countNA值少于 该值,则结果为NA。默认为 0.要返回NaN0.21 行为,请使用min_count=1

一些背景:在 pandas 0.21 中,我们修复了 all- NA系列的返回值长期存在的不一致问题,具体取决于是否安装了瓶颈。请参阅全 NaN 或空 Series/DataFrames 的 Sum/prod 现在始终为 NaN。同时,我们Series将空的 sum 和 prod 也改为NaN

根据反馈,我们已部分恢复这些更改。

算术运算#

现在,空或全NA 的默认总和为。Series0

熊猫0.21.x

In [1]: pd.Series([]).sum()
Out[1]: nan

In [2]: pd.Series([np.nan]).sum()
Out[2]: nan

熊猫0.22.0

In [1]: pd.Series([]).sum()
Out[1]: 0

In [2]: pd.Series([np.nan]).sum()
Out[2]: 0.0

默认行为与安装了bottleneck的pandas 0.20.3相同。它还与 NumPynp.nansum在空数组和全NA数组上的行为相匹配。

要返回空序列的总和NaN(无瓶颈的 pandas 0.20.3 或 pandas 0.21.x 的默认行为),请使用关键字min_count

In [3]: pd.Series([]).sum(min_count=1)
Out[3]: nan

由于该skipna参数,.sumNA.sum系列上的 概念上与空系列 skipna=True(默认)的 相同。

In [4]: pd.Series([np.nan]).sum(min_count=1)  # skipna=True by default
Out[4]: nan

min_count参数是指非 NA 和或乘积所需的非空值的最小数量。

Series.prod()已更新为与 相同的行为Series.sum(),而是返回1

In [5]: pd.Series([]).prod()
Out[5]: 1

In [6]: pd.Series([np.nan]).prod()
Out[6]: 1.0

In [7]: pd.Series([]).prod(min_count=1)
Out[7]: nan

这些变化也会影响DataFrame.sum()DataFrame.prod()。最后,pandas 中一些不太明显的地方也受到了这一变化的影响。

按类别#分组

Categorical现在返回按 a 分组并求和,0而不是 NaN返回没有观察值的类别。该产品现在返回1 而不是NaN.

熊猫0.21.x

In [8]: grouper = pd.Categorical(['a', 'a'], categories=['a', 'b'])

In [9]: pd.Series([1, 2]).groupby(grouper, observed=False).sum()
Out[9]:
a    3.0
b    NaN
dtype: float64

熊猫0.22

In [8]: grouper = pd.Categorical(["a", "a"], categories=["a", "b"])

In [9]: pd.Series([1, 2]).groupby(grouper, observed=False).sum()
Out[9]: 
a    3
b    0
Length: 2, dtype: int64

NaN要恢复未观察组返回的 0.21 行为,请使用min_count>=1

In [10]: pd.Series([1, 2]).groupby(grouper, observed=False).sum(min_count=1)
Out[10]: 
a    3.0
b    NaN
Length: 2, dtype: float64

重新采样#

所有NA箱的总和与积已从总和与积更改NaN为。01

熊猫0.21.x

In [11]: s = pd.Series([1, 1, np.nan, np.nan],
   ....:               index=pd.date_range('2017', periods=4))
   ....: s
Out[11]:
2017-01-01    1.0
2017-01-02    1.0
2017-01-03    NaN
2017-01-04    NaN
Freq: D, dtype: float64

In [12]: s.resample('2d').sum()
Out[12]:
2017-01-01    2.0
2017-01-03    NaN
Freq: 2D, dtype: float64

熊猫0.22.0

In [11]: s = pd.Series([1, 1, np.nan, np.nan], index=pd.date_range("2017", periods=4))

In [12]: s.resample("2d").sum()
Out[12]: 
2017-01-01    2.0
2017-01-03    0.0
Freq: 2D, Length: 2, dtype: float64

要恢复 0.21 的返回行为NaN,请使用min_count>=1.

In [13]: s.resample("2d").sum(min_count=1)
Out[13]: 
2017-01-01    2.0
2017-01-03    NaN
Freq: 2D, Length: 2, dtype: float64

特别是,上采样和求和或乘积会受到影响,因为即使原始序列完全有效,上采样也会引入缺失值。

熊猫0.21.x

In [14]: idx = pd.DatetimeIndex(['2017-01-01', '2017-01-02'])

In [15]: pd.Series([1, 2], index=idx).resample('12H').sum()
Out[15]:
2017-01-01 00:00:00    1.0
2017-01-01 12:00:00    NaN
2017-01-02 00:00:00    2.0
Freq: 12H, dtype: float64

熊猫0.22.0

In [14]: idx = pd.DatetimeIndex(["2017-01-01", "2017-01-02"])
In [15]: pd.Series([1, 2], index=idx).resample("12H").sum()
Out[15]:
2017-01-01 00:00:00    1
2017-01-01 12:00:00    0
2017-01-02 00:00:00    2
Freq: 12H, Length: 3, dtype: int64

该关键字再次min_count可用于恢复 0.21 的行为。

In [16]: pd.Series([1, 2], index=idx).resample("12H").sum(min_count=1)
Out[16]:
2017-01-01 00:00:00    1.0
2017-01-01 12:00:00    NaN
2017-01-02 00:00:00    2.0
Freq: 12H, Length: 3, dtype: float64

滚动和扩展#

滚动和扩展已经有一个min_periods行为类似于 的关键字min_count。唯一发生变化的情况是使用 进行滚动或扩展总和时min_periods=0。以前,当窗口中的非NANaN值少于此值时,会返回此值。现在它回来了。min_periods0

熊猫0.21.1

In [17]: s = pd.Series([np.nan, np.nan])

In [18]: s.rolling(2, min_periods=0).sum()
Out[18]:
0   NaN
1   NaN
dtype: float64

熊猫0.22.0

In [14]: s = pd.Series([np.nan, np.nan])

In [15]: s.rolling(2, min_periods=0).sum()
Out[15]: 
0    0.0
1    0.0
Length: 2, dtype: float64

的默认行为min_periods=None(意味着min_periods 等于窗口大小)保持不变。

兼容性

如果您维护一个应该跨 pandas 版本运行的库,那么从您的要求中排除 pandas 0.21 可能是最简单的方法。否则,您的所有 sum()调用都需要Series在求和之前检查是否为空。

通过 setuptools,在您的setup.py使用中:

install_requires=['pandas!=0.21.*', ...]

与conda,使用

requirements:
  run:
    - pandas !=0.21.0,!=0.21.1

请注意,对于 pandas 0.20.3 及更早版本,all- NA系列的返回值不一致仍然存在。避免使用 pandas 0.21 只会对空的情况有所帮助。

贡献者#

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

  • 汤姆·奥格斯普格