2016-11-28 38 views
5

To musi być oczywiste, ale nie mogłem znaleźć łatwego rozwiązania.Pandasowa ramka danych do macierzy zliczeń

mam pandy DataFrame takiego:

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

Chcę to:

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

Odpowiedz

6

Można użyć groupby z agregowania size i 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 

Innym rozwiązaniem z 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

akceptuje dla 'crosstab'. Unstacking size() wydaje się trochę dla mnie hackerem. –

+0

Dziękujemy za przyjęcie! Pierwsze rozwiązanie jest szybsze, ale zgadzam się, że to trochę hack. – jezrael

+1

'W [142]:% timeit pd.crosstab (df.actual, df.predicted) 100 pętli, najlepiej 3: 5,04 ms na pętlę' i ' W [143]:% timeit df.groupby ([ 'actual', 'predicted']). size(). unstack (fill_value = 0) 1000 pętli, najlepiej 3: 1,28 ms na pętlę ' – jezrael

2

Można użyć 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

trochę strzał w ciemno, ale myślę, że szukasz confusion matrix

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