2014-04-23 33 views
7

Tôi muốn vẽ một boxplot cho gấu trúc dataframe sau:Boxplot phân tầng theo cột ở gấu trúc python

> p1.head(10) 

    N0_YLDF MAT 
0  1.29 13.67 
1  2.32 10.67 
2  6.24 11.29 
3  5.34 21.29 
4  6.35 41.67 
5  5.35 91.67 
6  9.32 21.52 
7  6.32 31.52 
8  3.33 13.52 
9  4.56 44.52 

Tôi muốn boxplots phải của cột 'N0_YLDF', nhưng họ cần được phân tầng theo ' CHIẾU'. Khi tôi sử dụng các foll. lệnh:

p1.boxplot(column='N0_YLDF',by='MAT') 

Nó sử dụng tất cả các giá trị MAT độc đáo, mà trong số p1 dataframe đầy đủ khoảng 15.000. Điều này dẫn đến một ô không thể hiểu được.

Có cách nào tôi có thể phân tầng các giá trị MAT, vì vậy mà tôi có được một boxplot khác nhau của N0_YLDF cho tứ phân vị đầu tiên của giá trị MAT và vân vân ....

cảm ơn!

Trả lời

5

pandas.qcut sẽ cung cấp cho bạn các quantiles, nhưng một hoạt động biểu đồ giống như sẽ yêu cầu một số numpy thủ đoạn gian trá mà có ích ở đây:

_, breaks = np.histogram(df.MAT, bins=5) 
ax = df.boxplot(column='N0_YLDF', by='Class') 
ax.xaxis.set_ticklabels(['%s'%val for i, val in enumerate(breaks) if i in df.Class]) 

enter image description here

Các dataframe bây giờ trông như thế này:

N0_YLDF MAT Class 
0  1.29 13.67  1 
1  2.32 10.67  0 
2  6.24 11.29  1 
3  5.34 21.29  1 
4  6.35 41.67  2 
5  5.35 91.67  5 
6  9.32 21.52  1 
7  6.32 31.52  2 
8  3.33 13.52  1 
9  4.56 44.52  3 

[10 rows x 3 columns] 

Nó cũng có thể được sử dụng để lấy biểu đồ tứ phân vị:

breaks = np.asarray(np.percentile(df.MAT, [25,50,75,100])) 
df['Class'] = (df.MAT.values > breaks[..., np.newaxis]).sum(0) 
ax = df.boxplot(column='N0_YLDF', by='Class') 
ax.xaxis.set_ticklabels(['%s'%val for val in breaks]) 

enter image description here

+0

này là rất tốt, cảm ơn bạn rất nhiều lần nữa! Có cách nào bạn có thể thay thế các nhãn trục x theo giá trị số lượng MAT thực tế không? – user308827

+0

Ngoài ra, những gì là ... trong nghỉ [...]? cảm ơn! – user308827

+1

Thật dễ dàng, bạn chỉ có thể sử dụng giá trị của 'ngắt', nếu cốt truyện được trả về dưới dạng' ax': thêm «ax.xaxis.set_ticklabels» (['% s'% val cho i, val trong liệt kê (ngắt) if i in df.Class]) ',' breaks' chứa các cạnh của biểu đồ. –

8

Pandas có các chức năng cutqcut để làm biến phân tầng như thế này dễ dàng:

# Just asking for split into 4 equal groups (i.e. quartiles) here, 
# but you can split on custom quantiles by passing in an array 
p1['MAT_quartiles'] = pd.qcut(p1['MAT'], 4, labels=['0-25%', '25-50%', '50-75%', '75-100%']) 
p1.boxplot(column='N0_YLDF', by='MAT_quartiles') 

Output:

enter image description here

+0

cảm ơn bạn rất nhiều! Tôi sẽ sử dụng nhiều qcut trong tương lai .... – user308827

+0

@Marius muốn thực hiện yêu cầu kéo để thêm vào cookbook.rst? xin làm điều đó nội tuyến để con số cho thấy với mã là tốt - bao gồm một liên kết đến câu hỏi này là tốt - cảm ơn – Jeff

+0

@ Jeff: Chắc chắn, tôi sẽ cố gắng để có được vòng với nó tối nay. Tôi đã có ý nghĩa để xem nếu có bất kỳ đóng góp hữu ích tôi có thể thêm vào gấu trúc, điều này có vẻ như một nơi tốt để bắt đầu. – Marius

Các vấn đề liên quan