2015-11-06 42 views
5

Giả sử chúng ta có một df:Python-gấu trúc Thay NA với mức trung bình hoặc trung bình của một nhóm trong dataframe

A  B 
    apple 1.0 
    apple 2.0 
    apple NA 
    orange NA 
    orange 7.0 
    melon 14.0 
    melon NA 
    melon 15.0 
    melon 16.0 

để thay thế cho NA, chúng ta có thể sử dụng df [ "B"] fillna (df [. "B"]. Trung bình()), nhưng nó sẽ điền NA với trung bình của tất cả dữ liệu trong "B"

Có cách nào để chúng tôi có thể sử dụng trung bình của một A nhất định để thay thế NA (như dưới đây):

A  B 
    apple 1.0 
    apple 2.0 
    apple **1.5** 
    orange **7.0** 
    orange 7.0 
    melon 14.0 
    melon **15.0** 
    melon 15.0 
    melon 16.0 

Cảm ơn!

+1

tại sao R gắn thẻ? –

+1

'với (dd, ifelse (is.na (B), ave (B, A, FUN = hàm (x) trung bình (x, na.rm = TRUE)), B))' – rawr

+0

Giá trị này không có R tag – hrbrmstr

Trả lời

6

Trong gấu trúc bạn có thể sử dụng để có được transform null-điền giá trị:

>>> med = df.groupby('A')['B'].transform('median') 
>>> df['B'].fillna(med) 
0  1.0 
1  2.0 
2  1.5 
3  7.0 
4  7.0 
5 14.0 
6 15.0 
7 15.0 
8 16.0 
Name: B, dtype: float64 
+0

Cảm ơn sự giúp đỡ! – Robin1988

+1

Bạn có thể làm điều đó cho tất cả các cột cùng một lúc và tránh phải chỉ định các cột không? Trong R ví dụ, điều này có thể được thực hiện dưới dạng df <- na.roughfix (df) – y0gapants

2

Trong R, có thể sử dụng na.aggregate/data.table để thay thế giá trị NA bởi mean của nhóm. Chúng tôi chuyển đổi 'data.frame' thành 'data.table' (setDT(df)), được nhóm theo 'A', áp dụng na.aggregate trên 'B'.

library(zoo) 
library(data.table) 
setDT(df)[, B:= na.aggregate(B), A] 
df 
#  A B 
#1: apple 1.0 
#2: apple 2.0 
#3: apple 1.5 
#4: orange 7.0 
#5: orange 7.0 
#6: melon 14.0 
#7: melon 15.0 
#8: melon 15.0 
#9: melon 16.0 
+0

Cảm ơn bạn đã trả lời nhanh chóng.Giày python có phương pháp tương tự? – Robin1988

+1

@ Robin1988 Có, mã nằm trong R. Tôi đã đăng nó vì bạn đã gắn thẻ 'r'. – akrun

+1

Cảm ơn! Nó đã cho tôi một số manh mối – Robin1988

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