为了账号安全,请及时绑定邮箱和手机立即绑定

Pandas 在大于 0.21.0 的版本上使用 fillna() 和 sum() 返回不同的结果

Pandas 在大于 0.21.0 的版本上使用 fillna() 和 sum() 返回不同的结果

叮当猫咪 2021-09-02 20:19:04
在通过 SO 问题和模拟答案时,我发现 Pandas 版本之间存在奇怪的行为 0.21.0在使用fillna以及sum()它的工作原理是所需但是一个列,它导致0.0以上版本0.21.0。数据帧结构:>>> df = pd.DataFrame({'PlaceTest':[21,21,22,22], 'Approved':[1,0,1,0]})>>> df   PlaceTest  Approved0         21         11         21         02         22         13         22         0groupby 使用sum()..创建新列>>> df['Not Approved'] = df.groupby('PlaceTest')['Approved'].sum()>>> df   PlaceTest  Approved  Not Approved0         21         1           NaN1         21         0           NaN2         22         1           NaN3         22         0           NaN现在,在使用 version 时,0.21.0它会得到如下所需的结果:>>> df = df.groupby('PlaceTest')['Approved', 'Not Approved'].sum().fillna("1").reset_index()>>> df   PlaceTest  Approved Not Approved0         21         1            11         22         1            1但是,对 version 使用相同的方法时没有结果0.23.3。>>> df.groupby('PlaceTest')['Approved', 'Not Approved'].sum().fillna("1").reset_index()   PlaceTest  Approved  Not Approved0         21         1           0.01         22         1           0.0sum()与fillna方法一起使用时,与更高版本的熊猫相比,功能是否有任何变化?希望对此有任何专家评论,它可能在那里,但目前似乎不在我的脑海中。
查看完整描述

1 回答

?
PIPIONE

TA贡献1829条经验 获得超9个赞

根据Pandas v0.22.0 的新增功能(我的重点):

Pandas 0.22.0 更改了对空和全 NA 总和和产品的处理。总结就是

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

  • 空的或全 NA 系列的产品现在是 1

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

所以在 v.0.22.0 中:


In [16]: df.groupby('PlaceTest')['Approved', 'Not Approved'].sum()

Out[16]: 

           Approved  Not Approved

PlaceTest                        

21                1           0.0

22                1           0.0

而在 v0.21.0 中:


In [16]: df.groupby('PlaceTest')['Approved', 'Not Approved'].sum()

Out[16]: 

           Approved  Not Approved

PlaceTest                        

21                1           NaN

22                1           NaN

因此,在前一种情况下fillna("1")什么都不做,因为没有要填充的 NaN。



查看完整回答
反对 回复 2021-09-02
  • 1 回答
  • 0 关注
  • 273 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信