2015-10-10 49 views
7

我想学习熊猫,但我一直困惑与以下请。我想替换NaNs是一个与行平均数据帧。因此,像df.fillna(df.mean(axis=1))应该工作,但由于某种原因,它失败了。我错过了什么,我做错了什么?是因为它没有实施;看到link here熊猫数据框:用平均数替换NaN

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 

然而这样的事情看起来做工精细

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

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

该功能仍然没有实现收益 - 在[问题仍然是开放的(https://github.com/pydata/pandas/issues/4514)。 –

+0

好的,非常感谢! – Aenaon

回答

12

作为评价轴参数fillna是NotImplemented

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

注:这将是至关重要这里你不想填写您的第n列与第n行平均水平。

现在你需要遍历:

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 

另一种方法是fillna转置,然后转,这可能是更有效的...

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

谢谢Andy,很好的回复 – Aenaon

1

作为或者,您也可以使用apply,并使用lambda这样的表达式:

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

c1 c2 c3 
0 1.0 4.0 7.0 
1 2.0 5.0 3.5 
2 3.0 6.0 9.0