我有一个如下所示的数据框:
5.29559 NaN 2.38176 NaN 0.51521 NaN 0.04454 0.00000 None None None None None None None None
0 NaN NaN NaN NaN 0 NaN NaN 0 NaN NaN 0 2 None None None
4.32454 NaN 1.77600 NaN 0.04454 NaN 0.00000 None None None None None None None None None
0 NaN NaN NaN NaN 0 NaN NaN 0 NaN NaN 2 None None None None
我正在尝试通过删除所有 NaN 值并尝试使当前数据框看起来像这样来生成数据框:
5.29559 2.38176 0.51521 0.04454 0.00000
0 0 0 0 2
4.32454 1.77600 0.04454 0.00000
0 0 0 2
有人可以帮忙吗? 我尝试了 dropna() 方法,但没有帮助。
让我们尝试堆叠以消除 nans,然后为每个级别重置索引,最后再次取消堆叠:
(df.stack()
.groupby(level=0)
.apply(lambda df: df.reset_index(drop=True))
.unstack())
0 1 2 3 4
0 5.29559 2.38176 0.51521 0.04454 0.0
1 0.00000 0.00000 0.00000 0.00000 2.0
2 4.32454 1.77600 0.04454 0.00000 NaN
3 0.00000 0.00000 0.00000 2.00000 NaN
说明:
首先,堆叠去除NaNs
df.stack()
0 0 5.29559
2 2.38176
4 0.51521
6 0.04454
7 0.00000
1 0 0.00000
5 0.00000
8 0.00000
11 0.00000
12 2.00000
2 0 4.32454
2 1.77600
4 0.04454
6 0.00000
3 0 0.00000
5 0.00000
8 0.00000
11 2.00000
dtype: float64
您会注意到索引的内部级别不是单调递增的。让我们用 groupby.apply 解决这个问题
_.groupby(level=0).apply(lambda df: df.reset_index(drop=True))
0 0 5.29559
1 2.38176
2 0.51521
3 0.04454
4 0.00000
1 0 0.00000
1 0.00000
2 0.00000
3 0.00000
4 2.00000
2 0 4.32454
1 1.77600
2 0.04454
3 0.00000
3 0 0.00000
1 0.00000
2 0.00000
3 2.00000
dtype: float64
现在我们拆开
_.unstack()
0 1 2 3 4
0 5.29559 2.38176 0.51521 0.04454 0.0
1 0.00000 0.00000 0.00000 0.00000 2.0
2 4.32454 1.77600 0.04454 0.00000 NaN
3 0.00000 0.00000 0.00000 2.00000 NaN