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

时间:2018-12-01 16:21:44

标签: python python-3.x pandas

在通过SO进行提问并模拟答案时,我发现Pandas版本的0.21.0之间存在奇怪的行为

虽然将fillnasum()一起用于一列,但可以按预期运行。但是,它会导致0.0高于版本0.21.0

DataFrame结构:

>>> df = pd.DataFrame({'PlaceTest':[21,21,22,22], 'Approved':[1,0,1,0]})
>>> df
   PlaceTest  Approved
0         21         1
1         21         0
2         22         1
3         22         0

在使用groupby时使用sum()创建新列。

>>> df['Not Approved'] = df.groupby('PlaceTest')['Approved'].sum()
>>> df
   PlaceTest  Approved  Not Approved
0         21         1           NaN
1         21         0           NaN
2         22         1           NaN
3         22         0           NaN

现在,在使用版本0.21.0时,它将获得所需的结果,如下所示:

>>> df = df.groupby('PlaceTest')['Approved', 'Not Approved'].sum().fillna("1").reset_index()

>>> df
   PlaceTest  Approved Not Approved
0         21         1            1
1         22         1            1

但是,在版本0.23.3中使用相同的方法却没有结果。

>>> df.groupby('PlaceTest')['Approved', 'Not Approved'].sum().fillna("1").reset_index()
   PlaceTest  Approved  Not Approved
0         21         1           0.0
1         22         1           0.0

同时使用sum()fillna方法时,更大版本的熊猫的功能是否有变化?

希望对此有任何专家的评论,它可能在那里,但目前似乎不在我的脑海。

参考问题goes here

1 个答案:

答案 0 :(得分:3)

What's New in Pandas v0.22.0(我的重点):

  

Pandas 0.22.0更改了对空和全不适用金额和产品的处理。总结是

     
      
  • 一个空或全NA序列的总和现在为0
  •   
  • 空白或全NA系列的乘积现在为1
  •   
     

某些背景:在熊猫0.21中,我们根据是否安装了瓶颈修复了所有NA系列的返回值长期存在的不一致问题。参见Sum/Prod of all-NaN or empty Series/DataFrames is now consistently NaN。同时,我们将空系列的和和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。