pandas DataFrame: thay thế các giá trị nan bằng trung bình của các cột


177

Tôi đã có một DataFrame gấu trúc chứa hầu hết các số thực, nhưng cũng có một vài nangiá trị trong đó.

Làm cách nào tôi có thể thay thế nans bằng mức trung bình của các cột?

Câu hỏi này rất giống với câu hỏi này: mảng numpy: thay thế các giá trị nan bằng trung bình của các cột nhưng thật không may, giải pháp đưa ra ở đó không hoạt động đối với DataFrame của gấu trúc.

Câu trả lời:


273

Bạn chỉ có thể sử dụng DataFrame.fillnađể điền nantrực tiếp vào:

In [27]: df 
Out[27]: 
          A         B         C
0 -0.166919  0.979728 -0.632955
1 -0.297953 -0.912674 -1.365463
2 -0.120211 -0.540679 -0.680481
3       NaN -2.027325  1.533582
4       NaN       NaN  0.461821
5 -0.788073       NaN       NaN
6 -0.916080 -0.612343       NaN
7 -0.887858  1.033826       NaN
8  1.948430  1.025011 -2.982224
9  0.019698 -0.795876 -0.046431

In [28]: df.mean()
Out[28]: 
A   -0.151121
B   -0.231291
C   -0.530307
dtype: float64

In [29]: df.fillna(df.mean())
Out[29]: 
          A         B         C
0 -0.166919  0.979728 -0.632955
1 -0.297953 -0.912674 -1.365463
2 -0.120211 -0.540679 -0.680481
3 -0.151121 -2.027325  1.533582
4 -0.151121 -0.231291  0.461821
5 -0.788073 -0.231291 -0.530307
6 -0.916080 -0.612343 -0.530307
7 -0.887858  1.033826 -0.530307
8  1.948430  1.025011 -2.982224
9  0.019698 -0.795876 -0.046431

Các chuỗi của fillnanói rằng valuenên là một vô hướng hoặc một dict, tuy nhiên, nó dường như cũng hoạt động với một Series. Nếu bạn muốn vượt qua một dict, bạn có thể sử dụng df.mean().to_dict().


10
df.fillna(df.mean())sẽ trả về khung dữ liệu mới, vì vậy bạn sẽ phải viết df=df.fillna(df.mean())để giữ nó.
yannis

bất kỳ ý tưởng tại sao tôi có thể nhận được số tiền sai cho ý nghĩa của việc sử dụng này?
bernando_vialli

25
Thay vì df=df.fillna(df.mean())bạn cũng có thể sử dụngdf.fillna(df.mean(), inplace=True)
Anderson Pimentel

19
LƯU Ý: nếu bạn muốn sử dụng này cho Machine Learning / Dữ liệu Khoa học: từ góc độ khoa học dữ liệu đó là sai đầu tiên thay thế NA và sau đó tách ra thành tàu và thử nghiệm ... Bạn PHẢI phân chia đầu tiên vào xe lửa và kiểm tra, sau đó thay thế bằng NA có nghĩa là trên tàu và sau đó áp dụng mô hình tiền xử lý trạng thái này để kiểm tra, xem câu trả lời liên quan đến sklearn dưới đây!
Fabian Werner

1
@ amalik2205 vì nếu không bạn đang rò rỉ thông tin từ bộ kiểm tra vào tập huấn luyện! Hãy tưởng tượng nó như thế này: Chúng tôi có 100 hàng dữ liệu và chúng tôi xem xét cột x. 99 mục đầu tiên của x là NA. Chúng tôi muốn tách ra hàng 100 như một bộ thử nghiệm. Giả sử hàng 100 có giá trị 20 trong cột x. Sau đó, bạn sẽ thay thế tất cả các mục trong tập huấn luyện trong cột x bằng 20, giá trị đến 100% từ tập kiểm tra. Do đó, đánh giá có thể đánh lừa bạn!
Fabian Werner


27
In [16]: df = DataFrame(np.random.randn(10,3))

In [17]: df.iloc[3:5,0] = np.nan

In [18]: df.iloc[4:6,1] = np.nan

In [19]: df.iloc[5:8,2] = np.nan

In [20]: df
Out[20]: 
          0         1         2
0  1.148272  0.227366 -2.368136
1 -0.820823  1.071471 -0.784713
2  0.157913  0.602857  0.665034
3       NaN -0.985188 -0.324136
4       NaN       NaN  0.238512
5  0.769657       NaN       NaN
6  0.141951  0.326064       NaN
7 -1.694475 -0.523440       NaN
8  0.352556 -0.551487 -1.639298
9 -2.067324 -0.492617 -1.675794

In [22]: df.mean()
Out[22]: 
0   -0.251534
1   -0.040622
2   -0.841219
dtype: float64

Áp dụng cho mỗi cột giá trị trung bình của các cột đó và điền vào

In [23]: df.apply(lambda x: x.fillna(x.mean()),axis=0)
Out[23]: 
          0         1         2
0  1.148272  0.227366 -2.368136
1 -0.820823  1.071471 -0.784713
2  0.157913  0.602857  0.665034
3 -0.251534 -0.985188 -0.324136
4 -0.251534 -0.040622  0.238512
5  0.769657 -0.040622 -0.841219
6  0.141951  0.326064 -0.841219
7 -1.694475 -0.523440 -0.841219
8  0.352556 -0.551487 -1.639298
9 -2.067324 -0.492617 -1.675794

4
Tôi không biết tại sao, nhưng df.fillna (df.mean ()) không hoạt động, chỉ có phiên bản của bạn được áp dụng. Python 3
Rocketq

12
# To read data from csv file
Dataset = pd.read_csv('Data.csv')

X = Dataset.iloc[:, :-1].values

# To calculate mean use imputer class
from sklearn.impute import SimpleImputer
imputer = SimpleImputer(missing_values=np.nan, strategy='mean')
imputer = imputer.fit(X[:, 1:3])
X[:, 1:3] = imputer.transform(X[:, 1:3])

Lợi thế của tất cả điều này so với các lựa chọn đơn giản hơn nhiều là gì?
AMC

@Roshan Jha Luôn luôn tốt hơn để giải thích logic. Có nhiều cách để thực hiện cùng một nhiệm vụ trong R & Python. Tuy nhiên, nếu bạn đang đề xuất một cái gì đó khác biệt, bạn có thể muốn chỉ ra một số lời khuyên cho việc đó
Tiến sĩ Nisha Arora

10

Nếu bạn muốn áp đặt các giá trị bị thiếu với giá trị trung bình và bạn muốn đi theo từng cột, thì điều này sẽ chỉ áp đặt với giá trị trung bình của cột đó. Điều này có thể dễ đọc hơn một chút.

sub2['income'] = sub2['income'].fillna((sub2['income'].mean()))

3
Vui lòng cung cấp một số giải thích về cách này giải quyết vấn đề.
Gurwinder Singh

10

Sử dụng trực tiếp df.fillna(df.mean())để điền vào tất cả các giá trị null với giá trị trung bình

Nếu bạn muốn điền giá trị null bằng giá trị trung bình của cột đó thì bạn có thể sử dụng giá trị này

giả sử x=df['Item_Weight']ở đây Item_Weightlà tên cột

ở đây chúng ta đang gán (điền giá trị null của x với giá trị trung bình của x vào x)

df['Item_Weight'] = df['Item_Weight'].fillna((df['Item_Weight'].mean()))

Nếu bạn muốn điền giá trị null bằng một số chuỗi thì hãy sử dụng

đây Outlet_sizelà tên cột

df.Outlet_Size = df.Outlet_Size.fillna('Missing')

9

Một lựa chọn khác bên cạnh những điều trên là:

df = df.groupby(df.columns, axis = 1).transform(lambda x: x.fillna(x.mean()))

Nó kém thanh lịch hơn các câu trả lời trước đây, nhưng nó có thể ngắn hơn nếu bạn muốn thay thế null bằng một số chức năng cột khác.


7

Gấu trúc: Cách thay thế NaN (nan giá trị ) bằng giá trị trung bình (trung bình), trung bình hoặc các số liệu thống kê khác của một cột

Giả sử DataFrame của bạn dfvà bạn có một cột được gọinr_items . Đây là: df['nr_items']

Nếu bạn muốn thay thế các NaNgiá trị của cột df['nr_items']bằng giá trị trung bình của cột :

Sử dụng phương pháp .fillna():

mean_value=df['nr_items'].mean()
df['nr_item_ave']=df['nr_items'].fillna(mean_value)

Tôi đã tạo một dfcột mới được gọi nr_item_aveđể lưu trữ cột mới với các NaNgiá trị được thay thế bằngmean giá trị của cột.

Bạn nên cẩn thận khi sử dụng mean. Nếu bạn có các ngoại lệ thì nên sử dụngmedian


0

sử dụng lớp tiền xử lý thư viện sklearn

from sklearn.impute import SimpleImputer
missingvalues = SimpleImputer(missing_values = np.nan, strategy = 'mean', axis = 0)
missingvalues = missingvalues.fit(x[:,1:3])
x[:,1:3] = missingvalues.transform(x[:,1:3])

Lưu ý: Trong phiên bản gần đây, missing_valuesgiá trị tham số thay đổi thành np.nantừNaN

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.