在tim上取消堆叠多个级别时,如何填充na值

2024-10-04 03:21:06 发布

您现在位置:Python中文网/ 问答频道 /正文

考虑一下pd.Seriess和{}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 ^{}

fill_value : replace NaN with this value if the unstack produces missing values

当我unstack

^{pr2}$

我确实得到NaNs。
所以我试着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被忽略。在

为什么?什么是变通办法?


Tags: l1valuenanfilllistpdmuxlol
2条回答

试试这个:

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

@MaxU的解决方案
很有道理。只需fillna(0)并更改dtype

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

糟糕的工作环境
太浪费了!在

  • 按照我想要的方式unstack只捕获列
  • 使用fill_value=0执行多个单个unstack,并使用上一步中的列重新编制索引。在

^{pr2}$

更好地解决
只有在这种特殊情况下才有效。在

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

相关问题 更多 >