我试图修改我的数据框,使标签编码特征的最后一个变量转换为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')








暂无数据