按多动态值拆分DataFrame:NVI与Main分类实现技术问询
解决方案
一、DataFrame拆分(NVI与Main)
实现思路
- 先筛选出所有
PROFILE_ID=7055的行,作为NVI的初始数据集; - 从初始NVI数据中提取
RO、VFUNIT(Unit Number)、REPAIR_DATE的映射关系,构建两类匹配条件:- 匹配相同
RO和VFUNIT的行; - 匹配相同
VFUNIT且REPAIR_DATE≤对应7055行日期的行;
- 匹配相同
- 将初始NVI与符合条件的行合并(去重),剩余行归入Main。
代码实现
import pandas as pd # 确保原始DataFrame的REPAIR_DATE为日期类型 df['REPAIR_DATE'] = pd.to_datetime(df['REPAIR_DATE']) # 1. 提取PROFILE_ID=7055的初始NVI数据 nvi_initial = df[df['PROFILE_ID'] == 7055].copy() # 2. 构建VFUNIT对应的RO集合与最大允许日期的映射 unit_info = {} for _, row in nvi_initial.iterrows(): vfunit = row['VFUNIT'] ro = row['RO'] date = row['REPAIR_DATE'] if vfunit not in unit_info: unit_info[vfunit] = {'ros': {ro}, 'max_date': date} else: unit_info[vfunit]['ros'].add(ro) # 保留该VFUNIT对应的最大日期,确保覆盖所有7055行的日期限制 if date > unit_info[vfunit]['max_date']: unit_info[vfunit]['max_date'] = date # 3. 筛选符合条件的行 match_condition = pd.Series(False, index=df.index) for vfunit, info in unit_info.items(): # 条件1:RO和VFUNIT完全匹配 cond_ro_match = (df['VFUNIT'] == vfunit) & (df['RO'].isin(info['ros'])) # 条件2:VFUNIT匹配且维修日期不超过对应限制 cond_date_match = (df['VFUNIT'] == vfunit) & (df['REPAIR_DATE'] <= info['max_date']) match_condition = match_condition | cond_ro_match | cond_date_match # 生成最终NVI和Main数据集 nvi_df = df[match_condition].drop_duplicates() main_df = df[~match_condition].copy()
二、按卡车制造商分类(基于YML配置)
实现思路
- 读取YML配置文件,获取制造商与对应标识的映射(比如制造商对应VFUNIT的前缀/特定值);
- 分别对NVI和Main DataFrame,根据配置拆分出各制造商的子数据集。
代码实现
import yaml # 读取YML配置文件,示例配置格式: # manufacturers: # 沃尔沃: # - VF001 # - VF002 # 奔驰: # - VF003 with open('manufacturers.yml', 'r', encoding='utf-8') as f: config = yaml.safe_load(f) manufacturer_rules = config['manufacturers'] # 定义按制造商拆分的函数 def split_by_manufacturer(target_df, rules): result_dict = {} # 遍历每个制造商的匹配规则 for manufacturer, identifiers in rules.items(): match_cond = pd.Series(False, index=target_df.index) for iden in identifiers: # 这里用前缀匹配,可根据实际需求改为精确匹配/包含匹配 match_cond = match_cond | target_df['VFUNIT'].str.startswith(iden) result_dict[manufacturer] = target_df[match_cond].copy() # 处理未匹配到任何制造商的行 all_cond = pd.Series(False, index=target_df.index) for cond in [target_df['VFUNIT'].str.startswith(iden) for _, ids in rules.items() for iden in ids]: all_cond = all_cond | cond result_dict['未分类'] = target_df[~all_cond].copy() return result_dict # 对NVI和Main分别执行分类 nvi_manufacturer_groups = split_by_manufacturer(nvi_df, manufacturer_rules) main_manufacturer_groups = split_by_manufacturer(main_df, manufacturer_rules) # 示例:获取沃尔沃的NVI数据 # volvo_nvi = nvi_manufacturer_groups['沃尔沃']
说明
- YML配置可根据实际数据结构调整匹配规则(比如精确匹配、包含特定字符串等);
- 分类函数可按需扩展,比如支持多字段组合匹配逻辑。
内容的提问来源于stack exchange,提问作者TedM
相关产品推荐
相关产品推荐

