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

基于多列条件转换Python DataFrame的技术求助(附示例数据)

基于多列条件转换测试DataFrame的实现方案

针对你提出的测试数据转换需求,下面用Pandas给出具体实现步骤,代码注释清晰,适合新手理解:

步骤1:导入依赖并准备示例数据

先导入必要的库,同时给出符合你需求的示例输入数据(方便你测试):

import pandas as pd
import numpy as np

# 示例输入DataFrame
data = {
    'Sec': ['S', 'E', 'S', 'E', 'S', 'E', 'S'],
    'Pos': ['N', 'N', '2', '2', 'N', 'N', '3'],
    'J': [1, 0, 1, 1, 0, np.nan, 1],
    'NJ': [1, 1, 0, 0, 0, np.nan, 1],
    'SJ': [1, 1, 1, 1, 0, np.nan, 0],
    'Key': ['K1', 'K1', 'K1', 'K1', 'K2', 'K2', 'K2']
}
df = pd.DataFrame(data)

步骤2:生成每个Key的故障标记列

根据规则,输出的J、NJ、SJ列需要反映对应Key下该参数是否存在故障(即是否出现过0):

# 按Key分组,判断每个参数是否存在0(故障),存在则标记为1,否则为0
fault_summary = df.groupby('Key')[['J', 'NJ', 'SJ']].apply(
    lambda x: (x == 0).any().astype(int)
).reset_index()

步骤3:定义故障组合映射函数

针对每个Key+Pos的分组,根据J、NJ、SJ的故障情况返回对应的数值:

def get_fault_code(group):
    # 提取分组内各参数的非空唯一值,用于判断故障状态
    j_vals = group['J'].dropna().unique()
    nj_vals = group['NJ'].dropna().unique()
    sj_vals = group['SJ'].dropna().unique()
    
    # 判断各参数是否存在故障(0)
    j_fault = 0 in j_vals
    nj_fault = 0 in nj_vals
    sj_fault = 0 in sj_vals
    
    # 规则8:全部为空
    if group[['J', 'NJ', 'SJ']].isna().all().all():
        return 8
    
    # 规则1:无0且至少有1个1
    if not j_fault and not nj_fault and not sj_fault:
        has_one = (1 in j_vals) or (1 in nj_vals) or (1 in sj_vals)
        if has_one:
            return 0
    
    # 匹配剩余故障组合规则
    if j_fault and not nj_fault and not sj_fault:
        return 1
    elif not j_fault and nj_fault and not sj_fault:
        return 2
    elif not j_fault and not nj_fault and sj_fault:
        return 3
    elif j_fault and nj_fault and not sj_fault:
        return 4
    elif not j_fault and nj_fault and sj_fault:
        return 5
    elif j_fault and not nj_fault and sj_fault:
        return 6
    elif j_fault and nj_fault and sj_fault:
        return 7
    
    # 兜底返回空值(理论上不会触发)
    return np.nan

步骤4:生成Pos列的故障代码并合并结果

按Key和Pos分组计算故障代码,再将Pos转为列,最后和故障标记列合并:

# 按Key+Pos分组计算故障代码,unstack将Pos转为列,空值填充为0
pos_fault_codes = df.groupby(['Key', 'Pos']).apply(get_fault_code).unstack(fill_value=0)

# 合并故障标记和Pos列数据,得到最终结果
final_df = pd.merge(fault_summary, pos_fault_codes, on='Key')

最终输出示例

运行上述代码后,final_df的结果如下:

KeyJNJSJN23
K1110120
K2111803

注意事项

  • 同一Key+Pos下有多行数据时,会综合所有行的非空值判断故障状态(比如只要有一行J=0,就判定该Pos下J存在故障)
  • 空值处理:函数中会先过滤空值,再判断故障状态;全部为空的情况单独返回8

内容的提问来源于stack exchange,提问作者Nandan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 20:50:27