2016-11-28 2 views
5

Cela doit être évident, mais je n'ai pas trouvé de solution facile.Pandas dataframe to count matrice

J'ai pandas géants dataframe comme ceci:

actual | predicted 
------ + --------- 
Apple | Apple 
Apple | Apple 
Apple | Banana 
Banana | Orange 
Orange | Apple 

Je veux ceci:

 | Apple | Banana | Orange 
------ + ------- + ------- + ------- 
Apple | 2  | 1  | 0 
Banana | 0  | 0  | 1 
Orange | 1  | 0  | 0 

Répondre

6

Vous pouvez utiliser groupby avec l'agrégation size et unstackMultiIndex:

df = df.groupby(['actual','predicted']).size().unstack(fill_value=0) 
print (df) 
predicted Apple Banana Orange 
actual       
Apple   2  1  0 
Banana   0  0  1 
Orange   1  0  0 

Une autre solution crosstab:

df = pd.crosstab(df.actual, df.predicted) 
print (df) 
predicted Apple Banana Orange 
actual       
Apple   2  1  0 
Banana   0  0  1 
Orange   1  0  0 
+0

acceptés pour 'crosstab'. Désempiler la taille() me semble un peu un hack. –

+0

Merci d'avoir accepté! La première solution est plus rapide, mais je suis d'accord c'est un peu hack. – jezrael

+1

'Dans [142]:% timeit pd.crosstab (df.actual, df.predicted) 100 boucles, le meilleur de 3: 5,04 ms par boucle' et ' Dans [143]:% timeit df.groupby ([ 'réel', 'prédit']). size(). unstack (fill_value = 0) 1000 boucles, le meilleur de 3: 1,28 ms par boucle' – jezrael

2

Vous pouvez utiliser pandas.pivot_table

>>> df.pivot_table(index='actual', columns='predicted', aggfunc=len).fillna(0).astype('int') 
predicted Apple Banana Orange 
actual      
Apple   2  1  0 
Banana  0  0  1 
Orange  1  0  0 
2

Bit d'un coup de feu dans l'obscurité, mais je pense que vous êtes à la recherche d'un confusion matrix

from sklearn.metrics import confusion_matrix 
print confusion_matrix(df['actual'], df['predicted'])