0.22.0版(2017年12月29日)#

这是从0.21.1开始的一个主要版本,包括一个与API冲突的单一更改。我们建议所有用户在仔细阅读发行说明(单数!)后升级到此版本。

向后不兼容的API更改#

Pandas0.22.0改变了对空和所有的处理- NA 和和乘积。概括地说,

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

  • 空的或全部的产品- NA Series 现在是 1

  • 我们已经添加了一个 min_count 参数设置为 .sum().prod() 控制使结果有效的最小有效值数量。如果少于 min_count 非- NA 值存在,则结果为 NA 。默认为 0 。归来 NaN ,0.21行为,使用 min_count=1

一些背景资料:在Pandas0.21中,我们修复了All的返回值长期不一致的问题- NA 系列取决于是否安装了瓶颈。看见 全NaN或空系列/数据帧的总和/生产现在是一致的NaN 。同时,我们更改了空格的总和和Prod Series 也是 NaN

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

算术运算#

EMPTY或ALL的默认和- NA Series 现在是 0

Pandas0.21.x

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

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

Pandas0.22.0

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

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

默认行为与安装了瓶颈的Pandas0.20.3相同。它也与NumPy的行为相匹配 np.nansum 在空虚和所有的- NA 数组。

使空数列的和返回 NaN (无瓶颈的Pandas0.20.3或Pandas0.21.x的默认行为),使用 min_count 关键字。

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

多亏了 skipna 参数,则 .sum 对所有人来说- NA 系列在概念上与 .sum 一座空荡荡的房子 skipna=True (默认设置)。

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

这个 min_count 参数引用的最小数量 non-null 非NA总和或乘积所需的值。

Series.prod() 已更新为行为与 Series.sum() ,返回 1 取而代之的是。

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

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 现在,求和又回来了 0 而不是 NaN 对于没有观察到的类别。产品现在返回 1 而不是 NaN

Pandas0.21.x

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

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

Pandas0.22

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

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

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

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

重采样#

所有的总和和乘积- NA 垃圾箱已从 NaN0 对于总和和 1 对于产品。

Pandas0.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

Pandas0.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

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

Pandas0.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

Pandas0.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 。以前,这是返回的 NaN ,当少于 min_periods 非- NA 价值就在窗口里。现在它又回来了 0

Pandas0.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

Pandas0.22.0

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

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

的默认行为 min_periods=None ,暗示着 min_periods 等于窗口大小,则保持不变。

兼容性#

如果您维护的库应该可以跨Pandas版本工作,那么将Pandas0.21排除在您的需求之外可能是最容易的。否则,你所有的 sum() 调用将需要检查是否 Series 在求和之前为空。

使用设置工具,在您的 setup.py 使用::

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

对于conda,使用

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

请注意,所有-的返回值不一致- NA 对于Pandas0.20.3和更早的版本,系列仍然存在。避开Pandas0.21只会对空箱子有所帮助。

贡献者#

共有1人为此次发布贡献了补丁。名字中带有“+”的人第一次贡献了一个补丁。

  • Tom Augspurger