如何基于分组列将多组预测值转换为组内最大值为1其余为0的格式
实现方案
方法1:使用Pandas实现(最便捷,适合数据量较大的场景)
你可以直接利用Pandas的分组转换能力实现需求,代码示例如下:
import pandas as pd # 输入数据 id_test = [3, 3, 3, 3, 4, 4, 4, 4] y_hat = [0.65, 0.33, 0.13, 0.00, 0.33, 0.34, 0.21, 0.08] # 构造DataFrame df = pd.DataFrame({"id": id_test, "y_hat": y_hat}) # 按id分组后,判断每行y_hat是否为分组内最大值,转浮点得到结果 df["y_hat_transform"] = (df["y_hat"] == df.groupby("id")["y_hat"].transform("max")).astype(float) # 提取结果数组 y_hat_transform = df["y_hat_transform"].tolist()
运行后得到的y_hat_transform就是你需要的[1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0]。
如果分组内存在多个相同的最大值,默认所有最大值行都会被标记为1.0,如果你只需要标记第一个最大值,可以把判断逻辑替换为:
df["y_hat_transform"] = (df.groupby("id")["y_hat"].rank(method="first", ascending=False) == 1).astype(float)
方法2:纯Python实现(无第三方依赖)
如果不想引入Pandas,可以用字典先统计每个分组的最大值,再遍历生成结果:
id_test = [3, 3, 3, 3, 4, 4, 4, 4] y_hat = [0.65, 0.33, 0.13, 0.00, 0.33, 0.34, 0.21, 0.08] # 第一步:统计每个id对应的最大y_hat值 group_max = {} for id_val, y in zip(id_test, y_hat): if id_val not in group_max or y > group_max[id_val]: group_max[id_val] = y # 第二步:逐行判断生成转换结果 y_hat_transform = [] for id_val, y in zip(id_test, y_hat): y_hat_transform.append(1.0 if y == group_max[id_val] else 0.0)
该方法不限制分组大小,适配任意长度的输入数据。
内容的提问来源于stack exchange,提问作者user572780
相关产品推荐
相关产品推荐

