2016-11-28 27 views
5

Điều này phải rõ ràng, nhưng tôi không thể tìm thấy một giải pháp dễ dàng.Pandas dataframe để đếm ma trận

Tôi có gấu trúc DataFrame như thế này:

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

Tôi muốn điều này:

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

Trả lời

6

Bạn có thể sử dụng groupby với tập hợp sizeunstackMultiIndex:

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 

Một giải pháp với 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

Được chấp nhận cho 'crosstab'. Unstacking size() có vẻ giống như một hack với tôi. –

+0

Cảm ơn bạn đã chấp nhận! Giải pháp đầu tiên là nhanh hơn, nhưng tôi đồng ý nó là một chút hack. – jezrael

+1

'Trong [142]:% thời gian pd.crosstab (df.actual, df.predicted) 100 vòng, tốt nhất là 3: 5,04 ms trên mỗi vòng lặp và 'Trong [143]:% timeit df.groupby ([ 'thực tế', 'được dự đoán']). size(). unstack (fill_value = 0) 1000 vòng, tốt nhất là 3: 1,28 ms mỗi vòng lặp ' – jezrael

2

Bạn có thể sử dụng 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 một shot trong bóng tối của, nhưng tôi nghĩ rằng bạn đang tìm kiếm một confusion matrix

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