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

o75abkj4  于 2023-04-18  发布在  其他
关注(0)|答案(3)|浏览(151)

我有一个 Dataframe ,如下所示:

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值来生成 Dataframe ,并尝试使当前 Dataframe 看起来像这样:

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

fcipmucu

fcipmucu1#

让我们尝试堆叠以消除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

说明:
首先,堆叠以移除NaN

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
yzckvree

yzckvree2#

您可以使用自定义函数从每行中删除空值:

>>> df.agg(lambda x: pd.Series([v for v in x if pd.notna(v)]), axis=1)

         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
dldeef67

dldeef673#

试试这个:

df = pd.DataFrame(your_table)
df = df.dropna(axis=1)
df = pd.DataFrame(df.values.reshape(-1, 5), columns=['col1', 'col2', 'col3', 'col4', 'col5'])

相关问题