热线电话:13121318867

登录
2019-02-18 阅读量: 1368
将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构建布尔掩码,并将其设置为零。

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')

0.0000
6
关注作者
收藏
评论(0)

发表评论

暂无数据
推荐帖子