基于多列条件转换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的结果如下:
| Key | J | NJ | SJ | N | 2 | 3 |
|---|---|---|---|---|---|---|
| K1 | 1 | 1 | 0 | 1 | 2 | 0 |
| K2 | 1 | 1 | 1 | 8 | 0 | 3 |
注意事项
- 同一Key+Pos下有多行数据时,会综合所有行的非空值判断故障状态(比如只要有一行J=0,就判定该Pos下J存在故障)
- 空值处理:函数中会先过滤空值,再判断故障状态;全部为空的情况单独返回8
内容的提问来源于stack exchange,提问作者Nandan
相关产品推荐
相关产品推荐

