Я пытался применить функцию к кадру данных в пандах. Я пытаюсь взять два столбца в качестве позиционных аргументов и сопоставить функцию с ним. Ниже приведен код, который я пробовал. Код:

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 в определенной функции. Я получаю эту ошибку: { { Х1 }}

0
Maagalam HARSHA VARDHAN 21 Дек 2019 в 05:53

2 ответа

Лучший ответ

В качестве аргумента в функции, которую вы передаете как часть метода apply, вы получаете аргумент pandas series и, используя аргумент axis, вы можете указать, должен ли он быть 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 столбец

>>> df['Y_pred'] = (df.X < 3).astype(int)
>>> df
   X  Y  Y_pred
0  1  4       1
1  2  5       1
2  3  6       0
3  4  7       0

О, кстати, я бы хотел, чтобы вы направили вас в этот интересный блог опубликовать

1
abhilb 21 Дек 2019 в 04:30

Функция apply берет каждый столбец один за другим, пропускает его через функцию и возвращает преобразованный столбец. Вот дополнительная документация по этой документации для панд . Ваша настройка была бы лучше для понимания списка. Вот как вы можете получить предполагаемое поведение:

df_a['con_mat_label'] = [confusion_matrix(act,pred) for (act,pred) in df[['y','y_pred']].to_numpy()]

Надеюсь, это поможет!

1
Yacine Mahdid 21 Дек 2019 в 03:40