我想尝试在Python中根据循环将值分配给数据框。
我有以下初始数据框:
thres = 0.1d = { '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 TP0 0.0 0 0 0 01 0.0 0 0 0 02 0.0 0 0 0 03 0.0 0 0 0 04 0.0 0 0 0 0
我期望的结果是逐步填充数据框,像这样:
T TN FN FP TP0 0.1 1 0 0 01 0.2 0 3 0 02 0.3 0 0 2 03 0.4 0 0 0 04 0.5 0 4 0 4
这里的错误在哪里?有没有避免使用循环的优雅方法?
回答:
像这样更改赋值:
dataframe.loc[0,'T'] = thresdataframe.loc[0,'TN'] = tndataframe.loc[0,'FP'] = fpdataframe.loc[0,'FN'] = fndataframe.loc[0,'TP'] = tp
当使用dataframe.loc[0]['TP'] = tp
时,你是将tp
赋值给一个副本,而不是原始数据框。详情请见返回视图与副本。