2015-10-10 29 views
7

Tôi đang cố gắng tìm hiểu gấu trúc nhưng tôi đã bị phân vân với những điều sau đây. Tôi muốn thay thế NaN là một khung dữ liệu có mức trung bình hàng. Do đó một cái gì đó như df.fillna(df.mean(axis=1)) nên làm việc nhưng đối với một số lý do nó không cho tôi. Tôi có thiếu bất cứ điều gì xin vui lòng, một cái gì đó tôi đang làm sai? Là bởi vì nó không được thực hiện; thấy link herePandas Dataframe: Thay thế NaN bằng hàng trung bình

import pandas as pd 
import numpy as np 
​ 
pd.__version__ 
Out[44]: 
'0.15.2' 

In [45]: 
df = pd.DataFrame() 
df['c1'] = [1, 2, 3] 
df['c2'] = [4, 5, 6] 
df['c3'] = [7, np.nan, 9] 
df 

Out[45]: 
    c1 c2 c3 
0 1 4 7 
1 2 5 NaN 
2 3 6 9 

In [46]: 
df.fillna(df.mean(axis=1)) 

Out[46]: 
    c1 c2 c3 
0 1 4 7 
1 2 5 NaN 
2 3 6 9 

Tuy nhiên một cái gì đó như thế này trông để làm việc tốt

df.fillna(df.mean(axis=0)) 

Out[47]: 
    c1 c2 c3 
0 1 4 7 
1 2 5 8 
2 3 6 9 
+3

Đó chức năng vẫn chưa thực hiện - các [vấn đề vẫn mở] (https://github.com/pydata/pandas/issues/4514). –

+0

Ok, cảm ơn vì điều này! – Aenaon

Trả lời

12

Như nhận xét đối số trục để fillna là NotImplemented.

df.fillna(df.mean(axis=1), axis=1) 

Lưu ý: đây sẽ là quan trọng ở đây là bạn không muốn để điền vào cột thứ n của bạn với mức trung bình hàng thứ n.

Đối với bây giờ bạn sẽ cần phải lặp qua:

In [11]: m = df.mean(axis=1) 
     for i, col in enumerate(df): 
      # using i allows for duplicate columns 
      # inplace *may* not always work here, so IMO the next line is preferred 
      # df.iloc[:, i].fillna(m, inplace=True) 
      df.iloc[:, i] = df.iloc[:, i].fillna(m) 

In [12]: df 
Out[12]: 
    c1 c2 c3 
0 1 4 7.0 
1 2 5 3.5 
2 3 6 9.0 

Một cách khác là fillna các transpose và sau đó transpose, có thể hiệu quả hơn ...

df.T.fillna(df.mean(axis=1)).T 
+0

Cảm ơn Andy, câu trả lời hay – Aenaon

1

Là một thay thế, bạn cũng có thể sử dụng một số apply với một biểu thức lambda như sau:

df.apply(lambda row: row.fillna(row.mean()), axis=1) 

năng suất cũng

c1 c2 c3 
0 1.0 4.0 7.0 
1 2.0 5.0 3.5 
2 3.0 6.0 9.0 
Các vấn đề liên quan