Python 如何比较数据帧的两列中的值
我有以下数据帧:Python 如何比较数据帧的两列中的值,python,python-3.x,pandas,numpy,dataframe,Python,Python 3.x,Pandas,Numpy,Dataframe,我有以下数据帧: y proba y_pred 0 1.0 0.637387 1 1 1.0 0.635165 1 2 1.0 0.766586 1 3 1.0 0.724564 1 4 1.0 0.889199 1 .. .. 我想比较y和y_pred,以便计算tp=y=1、y_pred=1、fp=y=0、y_pred=1、fn=y=1、y_pred=0和tn=y=0、y_pred=0。以下是我所尝试的: tp = 0 fp
y proba y_pred
0 1.0 0.637387 1
1 1.0 0.635165 1
2 1.0 0.766586 1
3 1.0 0.724564 1
4 1.0 0.889199 1
..
..
我想比较y和y_pred,以便计算tp=y=1、y_pred=1、fp=y=0、y_pred=1、fn=y=1、y_pred=0和tn=y=0、y_pred=0。以下是我所尝试的:
tp = 0
fp = 0
fn = 0
tn = 0
if data1['y'] == 1 and data1['y_pred'] == 1:
tp+= 1
elif data1['y'] == 0 and data1['y_pred'] == 1:
fp+= 1
elif data1['y'] == 1 and data1['y_pred'] == 0:
fn+= 1
elif data1['y'] == 0 and data1['y_pred'] == 0:
tn+= 1
但是这段代码抛出了一个错误:
ValueError:序列的真值不明确。使用a.empty、a.bool、a.item、a.any或a.all
您可以使用len函数计算行数,如下所示:
tp = len(data1[data1['y'].eq(1) & data1['y_pred'].eq(1)])
fp = len(data1[data1['y'].eq(0) & data1['y_pred'].eq(1)])
fn = len(data1[data1['y'].eq(1) & data1['y_pred'].eq(0)])
tn = len(data1[data1['y'].eq(0) & data1['y_pred'].eq(0)])
不需要循环。您可以使用len函数计算行数,如下所示:
tp = len(data1[data1['y'].eq(1) & data1['y_pred'].eq(1)])
fp = len(data1[data1['y'].eq(0) & data1['y_pred'].eq(1)])
fn = len(data1[data1['y'].eq(1) & data1['y_pred'].eq(0)])
tn = len(data1[data1['y'].eq(0) & data1['y_pred'].eq(0)])
无需循环。不要重复代码,此处无需重复-仅获取计数并在多索引中选择值:
不要重复代码,此处不是必需的-仅获取计数并在多索引中选择值:
它实际上是一个由3列组成的数据框:y,probe,y_predIt它实际上是一个由3列组成的数据框:y,probe,y_pred@ManojKashyap很乐意帮忙。“请别忘了把答案也投上一票。”ManojKashyap很乐意帮忙。请不要忘记对答案进行投票。@ManojKashyap-您是否将df更改为df1?@ManojKashyap-看起来像是使用df.loc[1,1]而不是df1.loc[1,1],df而不是df1,答案已编辑。@ManojKashyap-您是否将df更改为df1?@ManojKashyap-看起来像是使用df.loc[1,1]而不是df1,答案已编辑。
df1 = df.groupby(['y','y_pred']).size()
print (df1)
y y_pred
0.0 0 2
1 3
1.0 0 1
1 2
tp = df1.loc[(1, 1)]
print (tp)
2
fp = df1.loc[(0, 1)]
print (fp)
3
fn = df1.loc[(1, 0)]
print (fn)
1
tn = df1.loc[(0, 0)]
p2rint (tn)