如何对pandas Series/DataFrame的标签值执行条件递减,适配已删除类别
解决方案
原有代码无法生效的核心原因是:遍历pandas Series时取出的label是值拷贝,修改局部变量不会同步修改原Series的存储值,且双层循环的执行效率极低,更适合用向量化操作实现需求。
实现方式1:apply写法(易理解,适合中小数据量)
逻辑为对每个标签,统计小于当前标签的待删除类数量,直接用原标签减去该数值即可:
import numpy as np classes_to_remove = [1, 3] # 替换为你实际的待删除类列表 remove_arr = np.array(classes_to_remove) # 计算后直接赋值回原DataFrame的labels列 df_known["labels"] = df_known["labels"].apply(lambda x: x - (remove_arr < x).sum())
实现方式2:纯向量化写法(高性能,适合十万级以上大数据量)
通过numpy广播机制避免循环开销,运行效率更高:
import numpy as np classes_to_remove = [1, 3] # 替换为你实际的待删除类列表 remove_arr = np.array(classes_to_remove) label_values = df_known["labels"].values # 向量化统计每个标签对应要减去的数值 sub_count = (label_values[:, None] > remove_arr).sum(axis=1) df_known["labels"] = label_values - sub_count
效果验证
- 针对第一个示例:
classes_to_remove = [1, 3],输入labels = [0, 2, 4],运行后输出为[0, 1, 2],符合预期。 - 针对第二个示例:
classes_to_remove = [2],原unique标签为[0, 1, 3, 4, 5, 6, 7],运行后所有大于2的标签统一减1,最终unique标签为[0, 1, 2, 3, 4, 5, 6],符合预期。
内容的提问来源于stack exchange,提问作者I M
相关产品推荐
相关产品推荐

