如何在我一次卸载多个级别时填写na值

时间:2017-01-28 22:14:48

标签: python pandas

使用pd.Series s

考虑pd.MultiIndex mux
lol = [list('aabc'), list('xyyz'), [1, 2, 3, 3]]
mux = pd.MultiIndex.from_arrays(lol, names='l1 l2 l3'.split())
s = pd.Series(range(1001, 1005), mux)

s

l1  l2  l3
a   x   1     1001
    y   2     1002
b   y   3     1003
c   z   3     1004
dtype: int64

根据documentation for unstack

  

fill_value :如果取消堆栈产生,则将NaN替换为此值   缺失值

当我unstack

s.unstack()

l3          1       2       3
l1 l2                        
a  x   1001.0     NaN     NaN
   y      NaN  1002.0     NaN
b  y      NaN     NaN  1003.0
c  z      NaN     NaN  1004.0

我得到NaN s 所以我试试fill_value=0

s.unstack(fill_value=0)

l3        1     2     3
l1 l2                  
a  x   1001     0     0
   y      0  1002     0
b  y      0     0  1003
c  z      0     0  1004

果然,NaN已被0填充。

但是,如果我希望一次unstack多一个级别。

s.unstack(['l2', 'l3'], fill_value=0)

l2       x       y               z
l3       1       2       3       3
l1                                
a   1001.0  1002.0     NaN     NaN
b      NaN     NaN  1003.0     NaN
c      NaN     NaN     NaN  1004.0

我的fill_value被忽略。

为什么?什么是解决方法?

2 个答案:

答案 0 :(得分:1)

@ MaxU的工作
最有意义。只需fillna(0)并更改dtype

s.unstack(['l2', 'l3']).fillna(0).astype(s.dtype)

可怕的工作
非常浪费!

  • 按照我想要捕捉列的方式unstack
  • 使用fill_value=0执行多个单独的重叠堆叠,并使用前一步骤中的列重新索引。
cols = s.unstack(['l2', 'l3']).columns
s.unstack('l2', fill_value=0).unstack('l3', fill_value=0).reindex_axis(cols, 1)

更好地解决
只适用于这种特殊情况。

使用fill_value=0将我不关心的一个级别展开,然后转置

s.unstack(0, fill_value=0).T

所有解决方案都产生

l2     x     y           z
l3     1     2     3     3
l1                        
a   1001  1002     0     0
b      0     0  1003     0
c      0     0     0  1004

答案 1 :(得分:1)

试试这个:

In [3]: s.unstack(['l2', 'l3']).fillna(0)
Out[3]:
l2       x       y               z
l3       1       2       3       3
l1
a   1001.0  1002.0     0.0     0.0
b      0.0     0.0  1003.0     0.0
c      0.0     0.0     0.0  1004.0