2017-01-20 24 views
6

Tôi có một dataframe:Thay thế giá trị ngoại biên với cột quantile trong Pandas dataframe

df = pd.DataFrame(np.random.randint(0,100,size=(5, 2)), columns=list('AB')) 
    A B 
0 92 65 
1 61 97 
2 17 39 
3 70 47 
4 56 6 

Dưới đây là 5% quantiles:

down_quantiles = df.quantile(0.05) 
A 24.8 
B 12.6 

Và đây là mặt nạ cho các giá trị thấp hơn quantiles:

outliers_low = (df < down_quantiles) 
     A  B 
0 False False 
1 False False 
2 True False 
3 False False 
4 False True 

Tôi muốn đặt giá trị trong df thấp hơn định lượng cho định lượng cột của nó . Tôi có thể làm như sau:

df[outliers_low] = np.nan 
df.fillna(down_quantiles, inplace=True) 

    A B 
0 92.0 65.0 
1 61.0 97.0 
2 24.8 39.0 
3 70.0 47.0 
4 56.0 12.6 

Nhưng chắc chắn phải có cách thanh lịch hơn. Làm thế nào tôi có thể làm điều này mà không cần fillna? Cảm ơn.

+0

bạn có phiền một lớp lót: 'df [~ outliers_low] .fillna (down_quantiles, inplace = True)'? – EdChum

+0

Tôi nghĩ rằng cần có nhiều con gấu trúc bản địa hơn để làm điều này. Và Nickil Maveli trả lời rõ ràng cho thấy nó. – shda

+0

Có, tôi quên mất 'mặt nạ', tôi đã upvoted câu trả lời của Nickil cho phù hợp – EdChum

Trả lời

8

Bạn có thể sử dụng phương thức DF.mask(). Bất cứ nơi nào có sự hiện diện của một ví dụ True, các giá trị từ chuỗi khác được thay thế căn chỉnh theo tên cột phù hợp bằng cách cung cấp axis=1.

df.mask(outliers_low, down_quantiles, axis=1) 

enter image description here


biến thể khác sẽ được sử dụng DF.where() phương pháp sau đảo ngược mặt nạ boolean của bạn bằng cách sử dụng dấu ngã (~) biểu tượng.

df.where(~outliers_low, down_quantiles, axis=1) 

enter image description here

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