python - 将 pandas DataFrame 中每一行的最后一个非零值转换为 0

标签 python pandas dataframe

我正在尝试修改我的数据帧,将标签编码特征的最后一个变量转换为0。例如,我有这个数据帧,顶行是标签,第一列作为索引:

df
   1  2  3  4  5  6  7  8  9  10
0  0  1  0  0  0  0  0  0  1   1
1  0  0  0  1  0  0  0  0  0   0
2  0  0  0  0  0  0  0  0  1   0

第 1-10 列是已编码的列。我想将此数据框转换为,而不更改任何其他内容:

   1  2  3  4  5  6  7  8  9  10
0  0  1  0  0  0  0  0  0  1   0
1  0  0  0  0  0  0  0  0  0   0
2  0  0  0  0  0  0  0  0  0   0

所以每行中出现的最后一个值应该转换为0。我正在考虑使用last_valid_index方法,但这会吸收其他剩余的列并改变它,这是我不想要的。感谢任何帮助

最佳答案

您可以使用cumsum构建 bool 掩码,并将其设置为零。

v = df.cumsum(axis=1)
df[v.lt(v.max(axis=1), axis=0)].fillna(0, downcast='infer')

   1  2  3  4  5  6  7  8  9  10
0  0  1  0  0  0  0  0  0  1   0
1  0  0  0  0  0  0  0  0  0   0
2  0  0  0  0  0  0  0  0  0   0
<小时/>

另一个类似的选项是在调用 cumsum 之前反转,您现在可以在一行中完成此操作。

df[~df.iloc[:, ::-1].cumsum(1).le(1)].fillna(0, downcast='infer')

   1  2  3  4  5  6  7  8  9  10
0  0  1  0  0  0  0  0  0  1   0
1  0  0  0  0  0  0  0  0  0   0
2  0  0  0  0  0  0  0  0  0   0

如果您有更多列,只需在切片上应用这些操作即可。稍后再分配回来。

u = df.iloc[:, :10]
df[u.columns] = u[~u.iloc[:, ::-1].cumsum(1).le(1)].fillna(0, downcast='infer')

关于python - 将 pandas DataFrame 中每一行的最后一个非零值转换为 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54737891/

相关文章:

Python 如果这个和这个和这个

python - 删除列表中除字符串以外的所有变量

python - 了解 scrapy 重命名图像的工作原理

scala - 将过滤器作为参数传递给 Dataframe.filter 函数

python - 从数据框行中的列表(包含标签)中获取唯一值

python - Django迁移ForeignKey到IntegerField不丢数据的迁移策略

python - ElasticSearch 查询 pandas 数据框

python - Pandas 组或重新采样数据框不包括列

python - 从多个字典创建数据框

python - 如何过滤 Pandas 数据框以显示顶级类别的行?