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

标签 python pandas missing-data reformat

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

说明:

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

关于python - 如何使用 Pandas 删除丢失的数据和 0,同时保持数据框相同的形状?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56912514/

相关文章:

r - 在 R 中创建 SpatialPointsDataFrame 时如何保持缺失坐标

python - 用python数据框中的列表替换python中的缺失值

python - Django Rest Framework Serializer 返回 UItextfield 而不是实际值

python - 如何从日期时间对象中仅提取月份和日期?

python - Pandas 根据其他细胞的连续性填充细胞

python - 如何使用 Python 进行随机分层抽样(不是训练/测试拆分)?

r - 处理 R 中缺失/不完整的数据——是否有屏蔽但不删除 NA 的功能?

python - 使用 Regex 将每个匹配实例替换为不同的字符串

php - Python 3 标准化 URL

python - 编写一个函数,给定自然数 n, m,确定最小自然数 k,使得 n^k >= m,时间为 O(log k)