我正在使用“Python For Data Analysis”,我不了解特定的功能。添加两个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
答案 0 :(得分:25)
Pandas并不认为500 + NaN = 500,但很容易让它这样做:a.add(b, fill_value=0)
答案 1 :(得分:2)
默认方法是假设任何涉及NaN的计算都会给出NaN作为结果。除NaN之外的任何东西都是NaN,任何被NaN分割的东西都是NaN等。如果你想用某些值填充NaN,你必须明确地这样做(正如Dan Allan在他的回答中所示)。
答案 2 :(得分:0)
使用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