如何在使用 Pandas 保持数据框形状相同的同时删除丢失的数据和 0?

Posted

技术标签:

【中文标题】如何在使用 Pandas 保持数据框形状相同的同时删除丢失的数据和 0?【英文标题】:How to remove missing data and 0s whilst keeping the dataframe the same shape using Pandas? 【发布时间】:2019-11-16 15:30:29 【问题描述】:

我有一个数据框,我想重新格式化它,以便它删除在第一个非零值出现在一行之前是否出现缺失值或零的实例。但是,我不想删除任何行或列,也不想删除出现在非零之后的任何 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']) 

【问题讨论】:

这是一个奇怪的任务。所以你不在乎列的值会改变吗? “我不想删除任何行或列”是什么意思。你能把问题说得更清楚吗? 我希望值发生变化,以便每个人同时以非零值开始。关于“我不想删除任何行或列”,我想保持整个表格的形状相同。对不起,如果我没有说清楚。 【参考方案1】:

这不是一个小问题。这是解决方案:

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

说明:

第 1 步:Name 列设置为索引,这样我们就可以只处理数值了。 Step2: m.mask(m.le(0)).bfill(axis=1).iloc[:,0] 给出第一个大于 0 的值。 第 3 步: 然后使用isin() 返回True 值出现在每一行中的任何位置。 Step4: cumsum(axis=1).astype(bool) 将所有剩余元素设为 True,因此我们可以仅过滤这些值,其他值变为 NaN。 然后使用链接帖子中的 justify 函数。

【讨论】:

以上是关于如何在使用 Pandas 保持数据框形状相同的同时删除丢失的数据和 0?的主要内容,如果未能解决你的问题,请参考以下文章

如何在保持相同形状和尺寸的同时获得 tensorflow 数据集中的最大值?

乘以不同维度的数据框 Pandas:列数相同,但行数不同

如何在两个 Pandas 数据帧中找到元素调和平均值

更改数据框索引值,同时保持其他列数据相同

将dict保存为pandas数据框时如何保持排序?

熊猫操纵数据框形状