You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

按多动态值拆分DataFrame:NVI与Main分类实现技术问询

解决方案

一、DataFrame拆分(NVI与Main)

实现思路

  1. 先筛选出所有PROFILE_ID=7055的行,作为NVI的初始数据集;
  2. 从初始NVI数据中提取RO、VFUNIT(Unit Number)、REPAIR_DATE的映射关系,构建两类匹配条件:
    • 匹配相同RO和VFUNIT的行;
    • 匹配相同VFUNIT且REPAIR_DATE≤对应7055行日期的行;
  3. 将初始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配置)

实现思路

  1. 读取YML配置文件,获取制造商与对应标识的映射(比如制造商对应VFUNIT的前缀/特定值);
  2. 分别对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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 11:50:18