Как сделать расчет в столбце в pandas и добавить результат в список - PullRequest
0 голосов
/ 20 февраля 2020

Это мой код

def calculate_TP(df):
    countTP=0
    countFP=0
    countTN=0
    countFN=0
    conf_lst=[]
    if df['y']==1 and df['x']==1:
        countTP+=1
    elif df['y']==0 and df['x']==1:
        countFP+=1
    elif df['y']==1 and df['x']==0:
        countFN+=1
    else:
        countTN+=1

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

conf_lst.append(countTP,countFP,countTN,countFN)

Как сделать Я делаю это? Мой фрейм данных выглядит примерно так:

y  x
1  0
0  1
1  1
1  1

Я должен применить вышеуказанную функцию, а затем изменить вывод в виде списка.

Ответы [ 3 ]

1 голос
/ 20 февраля 2020

Вы можете вывести сам список как return функции:

def calculate_TP(df):
    countTP = len(df[(df['y']==1) & (df['x']==1)])
    countFP = len(df[(df['y']==0) & (df['x']==1)])
    countFN = len(df[(df['y']==1) & (df['x']==0)])
    countTN = len(df[(df['y']==0) & (df['x']==0)])
    conf_lst = [countTP,countFP,countFN,countTN]
    return conf_lst
0 голосов
/ 20 февраля 2020

Если я не понимаю вашу цель, похоже, вы пытаетесь получить матрицу путаницы в виде списка. Вместо того, чтобы заново изобретать колесо, вы можете использовать функцию confusion_matrix из sklearn:

from sklearn.metrics import confusion_matrix
tn, fp, fn, tp = confusion_matrix(df.x, df.y).ravel()
conf_list = [tp, fp, tn, fn]

In [9]: conf_list                                                                                                                                                                                                  
Out[9]: [2, 1, 0, 1]                                                                                                                                                                                               
0 голосов
/ 20 февраля 2020

Используйте DataFrame.groupby:

df['count'] = df.groupby(['y','x'])['x'].transform('size')
print(df)
   y  x  count
0  1  0      1
1  0  1      1
2  1  1      2
3  1  1      2

, если вы хотите список:

df.groupby(['y','x'])['x'].size().unstack(fill_value=0).stack().tolist()

#[0, 1, 1, 2]

на вашем месте я бы использовал dict :

df.groupby(['y','x'])['x'].size().unstack(fill_value=0).stack().to_dict()

#{(0, 0): 0, (0, 1): 1, (1, 0): 1, (1, 1): 2}

Мы также можем сделать:

c = df['x'].ne(df['y'])
print(df.all(axis=1).sum())
print((~df.any(axis=1)).sum())
print(c.mul(df['x']).sum())
print(c.mul(df['y']).sum())


2
0
1
1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...