将两个包含NaN值的Series相加

23

我正在学习《Python数据分析》这本书,但我不理解其中一个功能。将两个pandas系列对象相加会自动对齐索引数据,但如果一个对象不包含该索引,则返回NaN。例如书中的例子:

a = Series([35000,71000,16000,5000],index=['Ohio','Texas','Oregon','Utah'])
b = Series([NaN,71000,16000,35000],index=['California', 'Texas', 'Oregon', 'Ohio'])

结果:

    In [63]: a
    Out[63]: Ohio          35000
             Texas         71000
             Oregon        16000
             Utah           5000
    In [64]: b
    Out[64]: California      NaN
             Texas         71000
             Oregon        16000
             Ohio          35000

当我把它们加在一起时,得到的结果是这个...

    In [65]: a+b
    Out[65]: California       NaN
             Ohio           70000
             Oregon         32000
             Texas         142000
             Utah             NaN

那么为什么犹他州的值是 NaN 而不是 500 呢?似乎 500+NaN=500。这是怎么回事?我可能漏掉了什么,请解释一下。

更新:

    In [92]: # fill NaN with zero
             b = b.fillna(0)
             b
    Out[92]: California        0
             Texas         71000
             Oregon        16000
             Ohio          35000

    In [93]: a
    Out[93]: Ohio      35000
             Texas     71000
             Oregon    16000
             Utah       5000

    In [94]: # a is still good
             a+b
    Out[94]: California       NaN
             Ohio           70000
             Oregon         32000
             Texas         142000 
             Utah             NaN

已解决:'+' 运算符执行两者的并集。我需要使用 .add() 方法。 - BubbleGuppies
3个回答

32

Pandas不会假设500+NaN=500,但很容易让它这样做:

a.add(b, fill_value=0)

2
既然您提到了这本书,您可以参考第128页的“算术和数据对齐”部分,该部分讨论了这个问题。 - bdiamante
1
啊啊啊... '+' 返回两者的<b>并集</b>!! 我需要add()方法。太棒了,谢谢@dbiamante @DanAllen! - BubbleGuppies

3

默认情况下,假设包含NaN的任何计算结果都是NaN。任何加上NaN的东西都是NaN,任何除以NaN的东西也是NaN等等。如果你想用某个值填充NaN,你必须明确地这样做(就像Dan Allan在他的答案中所示)。


1

使用 pd.concat() 更有意义,因为它可以接受更多的列。

import pandas as pd
import numpy as np

a = pd.Series([35000,71000,16000,5000],index=['Ohio','Texas','Oregon','Utah'])
b = pd.Series([np.nan,71000,16000,35000],index=['California', 'Texas', 'Oregon', 'Ohio'])

pd.concat((a,b), axis=1).sum(1, min_count=1)

输出:

California         NaN
Ohio           70000.0
Oregon         32000.0
Texas         142000.0
Utah            5000.0
dtype: float64

或者使用3系列:
import pandas as pd
import numpy as np

a = pd.Series([1, np.NaN, 4, 5])
b = pd.Series([3, np.NaN, 5, np.NaN])
c = pd.Series([np.NaN,np.NaN,np.NaN,np.NaN])

print(pd.concat((a,b,c), axis=1).sum(1, min_count=1))

#0    4.0
#1    NaN
#2    9.0
#3    5.0
#dtype: float64

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接