Python 一次取消堆叠多个级别时,如何填充na值

Python 一次取消堆叠多个级别时,如何填充na值,python,pandas,Python,Pandas,考虑带有pd.MultiIndexmux的pd.Seriess 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 1

考虑带有
pd.MultiIndex
mux的
pd.Series
s

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
根据

填充值:如果取消堆叠产生 缺失值

当我
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\u 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
s中填充了
0

但是,如果我想
一次取消堆叠
多个级别

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
我的
填充值
被忽略

为什么?什么是变通工作?

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

s.unstack(['l2', 'l3']).fillna(0).astype(s.dtype)
糟糕的工作环境
太浪费了

  • 按我想要的方式执行
    unstack
    以捕获列
  • 使用
    fill_value=0执行多个单个取消堆栈,并使用上一步中的列重新索引

更好地解决问题
仅在这种特殊情况下有效

使用
fill\u 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
试试这个:

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

s.unstack(['l2','l3'])有什么问题。fillna(0)
?在我看来,这似乎是一个错误,它可能无法处理多个未堆栈级别所需的重新索引,当然,您可以链接调用
fillna(0)
但是数据类型现在从最初填充值的失败升级为浮动,我会在@MaxU上提交一个错误。由于存在
NaN
如果
fill\u value
有效,数据类型将转换为浮动int@MaxU错的是,在这一步中,它转换为浮动。随后用零填充,它们仍然是浮动。如果是这样的话,你必须将其转换为int以保持int。我认为“有问题”的函数是
pandas.core.reforme.\uu unstack\u multiple
-如果你尝试这样做,你会有同样的行为:
s.unstack(['l2',fill\u value=0)
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