如何删除缺少的数据和0,同时使用熊猫保持数据框架相同的形状



我有一个数据框架,我想将其重新格式化,以便删除在第一个非零值出现在第一个不零值之前出现在第一个非零值之前发生的实例。但是,我不想删除任何行或列,也不想删除非零后出现的任何0或缺失值。

以下是我正在使用的数据框架:

> data =[['Adam',2.55,4.53,3.45,2.12,3.14],['Bill',np.NaN,2.14,3.65,4.12],['Chris',np.NaN,0,2.82,0,6.04],['David',np.NaN,0,7.42,3.52]]
> df = pd.DataFrame(data, columns = ['Name', 'A','B','C','D','E'])

此外,这是预期的结果:

> data1 =[['Adam',2.55,4.53,3.45,2.12,3.14],['Bill',2.14,3.65,4.12],['Chris',2.82,0,6.04],['David',7.42,3.52]]
> df1 = pd.DataFrame(data1, columns = ['Name', 'A','B','C','D','E']) 

这不是一个微不足道的问题。这是解决方案:

m=df.set_index('Name')
m=m[m.isin(m.mask(m.le(0)).bfill(axis=1).iloc[:,0]).cumsum(axis=1).astype(bool)]
print(m)

         A     B     C     D     E
Name                               
Adam   2.55  4.53  3.45  2.12  3.14
Bill    NaN  2.14  3.65  4.12   NaN
Chris   NaN   NaN  2.82  0.00  6.04
David   NaN   NaN  7.42  3.52   NaN

然后使用justify

pd.DataFrame(justify(m.values,np.nan),columns=m.columns,index=m.index).reset_index()

    Name     A     B     C     D     E
0   Adam  2.55  4.53  3.45  2.12  3.14
1   Bill  2.14  3.65  4.12   NaN   NaN
2  Chris  2.82  0.00  6.04   NaN   NaN
3  David  7.42  3.52   NaN   NaN   NaN

说明:

step1:Name列设置为索引,以便我们只能处理数字值。 step2: m.mask(m.le(0)).bfill(axis=1).iloc[:,0]给出的第一个值大于0。 step3:然后使用isin()在每行中出现在任何位置时返回True step4: cumsum(axis=1).astype(bool)使所有其余元素都是正确的,因此我们只能过滤这些值,其他值将变为 NaN。然后使用链接帖子中的合理函数。

相关内容

  • 没有找到相关文章

最新更新