使用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
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
被忽略。
为什么?什么是解决方法?
答案 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