将Python数据处理代码封装为方法,生成multiple_instance标识列
封装代码为可复用方法实现多实例标记
完整封装方法
下面是针对需求封装好的可复用方法,支持自定义目标Code列表,同时保留原DataFrame的所有列:
import pandas as pd import numpy as np def add_multiple_instance_column(df, multiple_instance_codes=['A','B','C','D'], id_col='Id', code_col='Code', bill_id_col='bill_id'): # 1. 筛选符合目标Code的行(忽略大小写、空值) pattern = '|'.join(multiple_instance_codes) filt = df[code_col].str.contains(pattern, na=False, case=False) df_mul = df[filt].copy() # 避免修改原数据 if df_mul.empty: # 无匹配行时直接全设为0 df['multiple_instance'] = 0 return df # 2. 按Id分组统计出现次数 df_temp = df_mul.groupby([id_col])[[code_col]].size().reset_index(name='count') # 3. 将统计结果合并回筛选后的数据集 df_mul = df_mul.merge(df_temp, on=id_col, how='left') # 4. 按bill_id计算累积和 df_mul['Cumulative_Sum'] = df_mul.groupby([bill_id_col])['count'].cumsum() # 5. 生成multiple_instance标记列 df_mul['multiple_instance'] = np.where(df_mul['Cumulative_Sum'] > 1, 1, 0) # 6. 将标记列合并回原DataFrame,未匹配行设为0 df = df.merge(df_mul[[id_col, bill_id_col, 'multiple_instance']], on=[id_col, bill_id_col], how='left').fillna({'multiple_instance': 0}) return df
方法说明
- 参数说明:
df:输入的原始DataFrame(包含30列数据)multiple_instance_codes:自定义的目标Code列表,默认值为['A','B','C','D']id_col/code_col/bill_id_col:对应数据中的列名,默认匹配你提到的Id/Code/bill_id,列名不同可自行修改
- 核心逻辑:
- 筛选出Code属于目标列表的行
- 按Id统计每个Id的出现次数
- 按bill_id分组计算累积次数,累积次数大于1时标记为1,否则为0
- 将标记结果合并回原DataFrame,确保所有30列保留,未匹配行标记为0
调用示例
# 假设原始数据存储在df中 df = pd.read_csv('your_dataset.csv') # 使用默认Code列表调用 result_df = add_multiple_instance_column(df) # 自定义Code列表调用 custom_codes = ['X', 'Y', 'Z'] result_df = add_multiple_instance_column(df, multiple_instance_codes=custom_codes) # 列名不同时的调用(比如Id列叫user_id) result_df = add_multiple_instance_column(df, id_col='user_id')
验证结果
以你提供的示例数据为例,调用方法后会生成符合预期的multiple_instance列,同时保留原数据的所有列。
内容的提问来源于stack exchange,提问作者Alpha Beta
相关产品推荐
相关产品推荐

