通过删除 NaN 和左移值以减少列数来压缩 pandas DataFrame 中的数据

问题描述 投票:0回答:1

我有一个如下所示的数据框:

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() 方法,但没有帮助。

python pandas dataframe nan
1个回答
1
投票

让我们尝试堆叠以消除 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
© www.soinside.com 2019 - 2024. All rights reserved.