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

基于两个独立Pandas DataFrame构建新表及实现AUC计算的技术问题

解决Pandas DataFrame计算ROC曲线下面积(AUC)的问题

看起来你在实现AUC计算的时候踩了几个常见的小坑,我帮你梳理下问题并给出修正方案:

你的代码核心问题

  1. 变量名冲突覆盖:你在循环里用了for fpr, tpr in zip(...),这里的fpr和tpr直接覆盖了函数传入的两个DataFrame参数!后面再写fpr['False Positive Rate']的时候,fpr已经变成了循环里的单个数值,自然没法访问DataFrame的列,这是最关键的错误。
  2. np.trapz使用方式错误:np.trapz是用来对一整组数据计算梯形积分的,不需要在循环里逐个调用,循环里这么写完全违背了这个函数的设计逻辑。

修正后的代码实现

我给你两种方案,一种是用np.trapz快速计算,另一种是手动实现梯形法帮你理解原理:

import numpy as np
import pandas as pd

def areaUnderCurve(tpr_df, fpr_df):
    # 先从两个DataFrame中提取对应列的数值数组
    tpr_values = tpr_df['True Positive Rate'].values
    fpr_values = fpr_df['False Positive Rate'].values
    
    # 先校验两个数组长度一致(AUC计算需要FPR和TPR一一对应)
    if len(tpr_values) != len(fpr_values):
        raise ValueError("TPR和FPR的样本数量必须一致!")
    
    # 方案1:用np.trapz直接计算(推荐,简洁高效)
    # 注意AUC是ROC曲线下的面积,ROC曲线以FPR为x轴,TPR为y轴
    auc = np.trapz(y=tpr_values, x=fpr_values)
    
    # 方案2:手动实现梯形法(适合理解AUC计算原理)
    # auc = 0.0
    # for i in range(1, len(fpr_values)):
    #     # 梯形面积公式:(x2-x1) * (y1+y2)/2
    #     delta_fpr = fpr_values[i] - fpr_values[i-1]
    #     avg_tpr = (tpr_values[i] + tpr_values[i-1]) / 2
    #     auc += delta_fpr * avg_tpr
    
    return auc

关于构建新DataFrame的需求

如果你需要把两个DataFrame的FPR和TPR合并成一个新表,方便后续查看或处理,可以这么写:

# 合并FPR和TPR到同一个DataFrame
roc_combined = pd.DataFrame({
    'False Positive Rate': fpr_df['False Positive Rate'],
    'True Positive Rate': tpr_df['True Positive Rate']
})

这样你就可以通过roc_combined['False Positive Rate']来统一访问数据了。

额外提示

  • 计算AUC前建议先把FPR按从小到大排序(ROC曲线要求FPR从0到1递增),如果你的数据还没排序,可以加一行fpr_values, tpr_values = zip(*sorted(zip(fpr_values, tpr_values)))来确保顺序正确。
  • 如果你用scikit-learn的话,其实可以直接用sklearn.metrics.auc(fpr_values, tpr_values)来计算,不过自己实现一遍能更好理解原理~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:49:03