我试图将函数应用于熊猫中的数据框。我试图将两列用作位置参数并将一个函数映射到它。下面是我尝试的代码。 代码:
df_a=pd.read_csv('5_a.csv')
def y_pred(x):
if x<.5:
return 0
else:
return 1
df_a['y_pred']=df_a['proba'].map(y_pred)
def confusion_matrix(act,pred):
if act==1 and act==pred:
return 'TP'
elif act==0 and act==pred:
return 'TN'
elif act==0 and pred==1:
return 'FN'
elif act==1 and pred==0:
return 'FP'
df_a['con_mat_label']=df_a[['y','y_pred']].apply(confusion_matrix)
但是该函数未考虑将y_pred
作为第二列并将其映射到已定义函数中的pred变量。
我得到这个错误:
TypeError: ("confusion_matrix() missing 1 required positional argument: 'pred'", 'occurred at index y')
答案 0 :(得分:1)
apply函数一个接一个地获取每一列,通过该函数运行它并返回一个转换后的列。这是pandas documentation上的更多文档。 您的设置对于列表理解会更好。这里是如何获得预期的行为:
df_a['con_mat_label'] = [confusion_matrix(act,pred) for (act,pred) in df[['y','y_pred']].to_numpy()]
希望有帮助!
答案 1 :(得分:1)
作为apply
方法的一部分传递的函数中作为参数得到的是pandas series
,使用axis
参数可以指定是否必须为{{1 }}或row
。
因此,您需要将column
函数修改为
confusion_matrix
与此处的列名act
相对应* y
您需要将对def confusion_matrix(row):
if row.y==1 and row.y==row.y_pred:
return 'TP'
elif row.y==0 and row.y==row.y_pred:
return 'TN'
elif row.y==0 and row.y_pred==1:
return 'FN'
elif row.y==1 and row.y_pred==0:
return 'FP'
的呼叫修改为
apply
现在,让我给您一些有关如何改进代码的提示。
假设您有一个这样的数据框:
df_a['con_mat_label']=df_a[['y','y_pred']].apply(confusion_matrix, axis=1)
要添加>>> df
X Y
0 1 4
1 2 5
2 3 6
3 4 7
列
Y_pred
哦,顺便说一句,我希望您引荐您到这个有趣的博客post