【问题标题】:Append function outcome to a dataframe将函数结果附加到数据框
【发布时间】:2019-11-19 17:36:30
【问题描述】:

我尝试将依赖于循环的值分配给 python 中的数据框。

我有以下起始数据框:

thres = 0.1
d = { 'T': [0.], 'TN': [0], 'FN': [0], 'FP':[0], 'TP':[0]}
dataframef = pd.DataFrame(data=d)

用我的开始变量thres

现在我正在进入我的循环:

while thres <= 0.4:
    a = { 'T': [0], 'TN': [0], 'FN': [0], 'FP':[0], 'TP':[0]}
    dataframe = pd.DataFrame(data=a)
    y_pred = predictionthreshold(RandomForestClassifier(random_state=42), thres)
    tn, fp, fn, tp = confusion_matrix(y_test.ravel(), y_pred).ravel()
    dataframe.loc[0]['T'] = thres
    dataframe.loc[0]['TN'] = tn
    dataframe.loc[0]['FP'] = fp
    dataframe.loc[0]['FN'] = fn
    dataframe.loc[0]['TP'] = tp    
    dataframef = dataframef.append(dataframe, ignore_index=True)
    thres=thres+0.1

我的结果是:

    T   TN  FN  FP  TP
0   0.0     0   0   0   0
1   0.0     0   0   0   0
2   0.0     0   0   0   0
3   0.0     0   0   0   0
4   0.0     0   0   0   0

我会期待一些东西,它会逐步填充数据框:

    T   TN  FN  FP  TP
0   0.1     1   0   0   0
1   0.2     0   3   0   0
2   0.3     0   0   2   0
3   0.4     0   0   0   0
4   0.5     0   4   0   4 

其中的错误在哪里?有没有优雅的方法来避免循环?

【问题讨论】:

  • 什么是predictionthreshold?它没有定义。
  • predictionthreshold 是我的inviduel函数,它返回4个变量,我将它们存储在TN,FN,FP,TP中

标签: python pandas machine-learning random-forest confusion-matrix


【解决方案1】:

像这样改变分配:

dataframe.loc[0,'T'] = thres
dataframe.loc[0,'TN'] = tn
dataframe.loc[0,'FP'] = fp
dataframe.loc[0,'FN'] = fn
dataframe.loc[0,'TP'] = tp 

使用dataframe.loc[0]['TP'] = tp 时,您将tp 分配给副本,而不是原始数据帧。详情见Returning a view versus a copy

【讨论】:

  • 这是有效的,谢谢提示,知道为什么它不适用于副本吗?
  • 有什么办法可以避免 while 循环吗?
  • 因为你得到了一个修改后的副本,它在你的程序中没有被进一步使用。我添加了指向 pandas 文档的链接以获取更多详细信息。
  • 循环归因于你的程序逻辑,但如果你想简化它,你可以直接在结果后面加上dataframef = dataframef.append({ 'T': thres , 'TN': tn, 'FN': fn, 'FP':fp, 'TP':tp}, ignore_index=True),而不用创建临时的dataframe
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-03
  • 2021-04-22
  • 2016-07-24
  • 1970-01-01
  • 2021-01-11
  • 2013-08-07
相关资源
最近更新 更多