我正在尝试修改我的数据帧,将标签编码特征的最后一个变量转换为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/