如何按多字段分组规则为数据集inspection字段分条件赋值
基于Pandas的分组赋值实现方案
你可以直接通过pandas的分组apply能力完成全量数据的inspection字段赋值,无需提前拆分2元素、3元素的单独文件,代码会自动按组匹配规则。
步骤1:导入依赖读入数据
import pandas as pd import numpy as np # 替换为你的实际数据路径,支持csv、excel等格式 df = pd.read_csv("your_dataset.csv")
步骤2:运行分组赋值逻辑
将以下自定义函数传入分组apply方法即可完成批量赋值:
def fill_inspection(group_df: pd.DataFrame) -> pd.DataFrame: group_df = group_df.reset_index(drop=True) group_size = len(group_df) group_df["inspection"] = pd.NA result_values = group_df["result"].tolist() # 处理单组2条记录的场景 if group_size == 2: if set(result_values) == {1, 4}: group_df.loc[group_df["result"] == 4, "inspection"] = 1 group_df.loc[group_df["result"] == 1, "inspection"] = 2 elif set(result_values) == {1, 3}: group_df.loc[group_df["result"] == 3, "inspection"] = 1 group_df.loc[group_df["result"] == 1, "inspection"] = 2 elif all(v == 1 for v in result_values): # 默认取组内第一条赋值1,第二条赋值2,需要随机选择可替换为下方注释代码 group_df.loc[0, "inspection"] = 1 group_df.loc[1, "inspection"] = 2 # 随机选择版本: # rand_pos = np.random.randint(0,2) # group_df.loc[rand_pos, "inspection"] = 1 # group_df.loc[group_df["inspection"].isna(), "inspection"] = 2 # 处理单组3条记录的场景 elif group_size == 3: count_1 = result_values.count(1) if count_1 == 1: # 所有result=1的记录固定赋值2 group_df.loc[group_df["result"] == 1, "inspection"] = 2 # result=0的记录固定赋值0 group_df.loc[group_df["result"] == 0, "inspection"] = 0 # result=4的记录按出现顺序,第一条赋值1,其余赋值0 res4_pos = group_df[group_df["result"] ==4].index for i, pos in enumerate(res4_pos): group_df.loc[pos, "inspection"] = 1 if i ==0 else 0 elif all(v ==1 for v in result_values): # 默认取组内第一条赋值1,其余赋值2,需要随机选择可替换为下方注释代码 group_df.loc[0, "inspection"] =1 group_df.loc[1:, "inspection"] =2 # 随机选择版本: # rand_pos = np.random.randint(0,3) # group_df.loc[rand_pos, "inspection"] = 1 # group_df.loc[group_df["inspection"].isna(), "inspection"] = 2 group_df["inspection"] = group_df["inspection"].astype(int) return group_df # 按指定维度分组批量应用规则 df = df.groupby( ["Code", "Area", "Floor", "Box"], group_keys=False ).apply(fill_inspection)
注意事项
- 代码默认在全result=1的场景取组内第一条记录赋值1,代码中已经附了随机选择的替换代码,按需打开注释即可
- 3元素组的逻辑已经同时覆盖「两条result=4」「一条result=4+一条result=0」两种场景,不需要单独写分支判断
- 如果后续出现其他result值组合的场景,直接在对应组大小的分支下补充判断逻辑即可
- 赋值完成后可以通过
df.groupby(["Code", "Area", "Floor", "Box"]).size()校验每组的大小和赋值结果是否符合预期
内容的提问来源于stack exchange,提问作者Jesús Asdrúbal Molina Víquez
相关产品推荐
相关产品推荐

