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