2015-12-14 35 views
1

我有一个900 x 7数据框,其中3个字段包含一些NaN值。单独替换pandas.dataframe中的NaN

我没有简单地用某些特征平均值来替换这些值,而是创建了一个函数来使用算法根据该行中的其他值估计每个NaN的可能值。

如何迭代每个NaN以使用我的自定义函数更改其值?

我的函数将行ID,其他功能名称和包含NaN的功能作为参数。

E.g.

custom_fillnan(id=0, ins=["val0", "val1", "val2"], out="valn") 

实例数据框:

ID val0 val1 val2 ... valn 
0  1  2  3  ... NaN 
1  1  NaN  3  ...  4 
2  0  0  NaN  ...  1 
... 
+0

你打算列,行或每个单元迭代分别? –

+0

最好重复遍历行 – RockJake28

+0

您的算法在每行中的每个单元格中是否给出相同的值?或者你需要提取索引? –

回答

2

IIUC你可以使用applyaxis=1fillna与您的自定义功能:

In [80]: df 
Out[80]: 
    ID val0 val1 val2 valn 
0 0  1  2  3 NaN 
1 1  1 NaN  3  4 
2 2  0  0 NaN  1 


In [83]: df.apply(lambda x: x.fillna(pd.np.mean(x.iloc[1:])), axis=1) 
Out[83]: 
    ID val0  val1  val2 valn 
0 0  1 2.000000 3.000000  2 
1 1  1 2.666667 3.000000  4 
2 2  0 0.000000 0.333333  1 

相反的pd.np.mean你可以使用你的函数。使用x.iloc[1:]是因为,据我所知,您只想为您的函数使用val列。

编辑

如果你想获得列名的遗漏值,你可以应用或使用该函数进行处理:

def func(x): 
    x.loc[x.isnull()] = x.index[x.isnull()] 
    return x 

In [209]: df.apply(func, axis=1) 
Out[209]: 
    ID val0 val1 val2 valn 
0 0  1  2  3 valn 
1 1  1 val1  3  4 
2 2  0  0 val2  1 
+0

如何确定NaN发生在哪一列?因为这会影响哪些列的子集用于预测其值 – RockJake28

+0

@ RockJake28尝试编辑版本 –