两个具有NaN的多指数系列的总和

时间:2018-02-26 01:47:10

标签: python pandas

我想添加两个包含多个索引的系列,其中一个可以包含NaN值。只添加两个(a + b)不起作用,因为a中的某些索引条目可能不会出现在b中,反之亦然。

这是我目前针对索引(b, 50)失败的方法,因为此值应为NaN。

In [41]: a = pd.Series([1, 2, 3, np.nan, np.nan], index=pd.MultiIndex.from_tuples([('a', '1'), ('a', 2), ('b', 1), ('b', 50), ('b', 5)], names=['x', 'y']))
In [42]: b = pd.Series([4, 5, 6], index=pd.MultiIndex.from_tuples([('a', '1'), ('a', 3), ('b', 5)], names=['x', 'y']))
In [43]: c = pd.Series(0, index=a.index.union(b.index))
In [44]: c[a[a.notnull()].index] = a[a.notnull()]
In [45]: c
Out[45]: 
x  y 
a  2     2.0
   3     0.0
   1     1.0
b  1     3.0
   5     0.0
   50    0.0
dtype: float64

In [46]: c[b.index] += b

In [47]: c
Out[47]: 
x  y 
a  2     2.0
   3     5.0
   1     5.0
b  1     3.0
   5     6.0
   50    0.0
dtype: float64

In [48]: c[a.isnull() & b.isnull()] = np.NaN

In [49]: c
Out[49]: 
x  y 
a  2     2.0
   3     5.0
   1     5.0
b  1     3.0
   5     6.0
   50    0.0
dtype: float64

2 个答案:

答案 0 :(得分:2)

IIUC,这是你需要的吗?

a.add(b,fill_value=0)
Out[398]: 
x  y 
a  1     5.0
   2     2.0
b  1     3.0
   50    NaN
   5     6.0
a  3     5.0
dtype: float64

答案 1 :(得分:1)

您可以先对齐两个系列。

s1, s2 = a.align(b)
s = s1.fillna(0) + s2.fillna(0) 
s[s1.isna() & s2.isna()] = np.nan

# output of s
x  y 
a  1     5.0
   2     2.0
b  1     3.0
   50    NaN
   5     6.0
a  3     5.0
dtype: float64