如何在Pandas中高效编码分类器性能并处理NaN值
高效生成混淆矩阵分类列的Pandas实现
核心思路
针对真实标签列c1(A=正例、B=负例)和预测结果列c2(a=正预测、b=负预测),我们可以通过向量化布尔运算或规则字典循环替代冗余的loc赋值,同时自动处理NaN值(NaN参与比较时结果为False,对应四类标签均为0)。
方法1:向量化布尔运算(性能最优)
直接利用Pandas的向量化特性,通过布尔条件组合生成目标列,比逐行处理效率高得多:
import pandas as pd import numpy as np # 示例数据 df = pd.DataFrame({ 'c1': ['A', 'B', 'A', 'B', np.nan, 'A'], 'c2': ['a', 'b', 'b', 'a', 'a', np.nan] }) # 生成混淆矩阵四类列(0/1格式,若需布尔值可去掉astype(int)) df['truepos'] = ((df['c1'] == 'A') & (df['c2'] == 'a')).astype(int) df['trueneg'] = ((df['c1'] == 'B') & (df['c2'] == 'b')).astype(int) df['falsepos'] = ((df['c1'] == 'B') & (df['c2'] == 'a')).astype(int) df['falseneg'] = ((df['c1'] == 'A') & (df['c2'] == 'b')).astype(int)
方法2:规则字典循环(代码最简洁)
把四类判断规则存入字典,通过循环批量生成列,便于后续维护修改:
# 定义混淆矩阵规则字典 confusion_rules = { 'truepos': (df['c1'] == 'A') & (df['c2'] == 'a'), 'trueneg': (df['c1'] == 'B') & (df['c2'] == 'b'), 'falsepos': (df['c1'] == 'B') & (df['c2'] == 'a'), 'falseneg': (df['c1'] == 'A') & (df['c2'] == 'b') } # 循环生成所有目标列 for col_name, condition in confusion_rules.items(): df[col_name] = condition.astype(int)
方法3:lambda+apply(适合复杂自定义逻辑)
如果后续需要扩展更复杂的判断逻辑,可使用apply结合lambda逐行处理(注意:性能略低于前两种向量化方法):
df['truepos'] = df.apply(lambda x: 1 if x['c1'] == 'A' and x['c2'] == 'a' else 0, axis=1) df['trueneg'] = df.apply(lambda x: 1 if x['c1'] == 'B' and x['c2'] == 'b' else 0, axis=1) df['falsepos'] = df.apply(lambda x: 1 if x['c1'] == 'B' and x['c2'] == 'a' else 0, axis=1) df['falseneg'] = df.apply(lambda x: 1 if x['c1'] == 'A' and x['c2'] == 'b' else 0, axis=1)
内容的提问来源于stack exchange,提问作者crabulus_maximus
相关产品推荐
相关产品推荐

