用最相似的行中的值填充缺失值

Mar*_*ank 6 python pandas data-science

我有下表。一些值为NaN。让我们假设列是高度相关的。以row 0row 5我说,在这个值col24.0row 1和的情况相同row 4。但是,在这种情况下row 6,没有完美匹配的样本,因此在这种情况下,我应该选择最相似的行,row 0并将NaN更改为3.0。我应该如何处理?有任何熊猫功能可以做到这一点吗?

example = pd.DataFrame({"col1": [3, 2, 8, 4, 2, 3, np.nan], 
                        "col2": [4, 3, 6, np.nan, 3, np.nan, 5], 
                        "col3": [7, 8, 9, np.nan, np.nan, 7, 7], 
                        "col4": [7, 8, 9, np.nan, np.nan, 7, 6]})
Run Code Online (Sandbox Code Playgroud)

输出:

    col1    col2    col3    col4
0   3.0     4.0     7.0     7.0
1   2.0     3.0     8.0     8.0
2   8.0     6.0     9.0     9.0
3   4.0     NaN     NaN     NaN
4   2.0     3.0     NaN     NaN
5   3.0     NaN     7.0     7.0
6   NaN     5.0     7.0     6.0
Run Code Online (Sandbox Code Playgroud)

WeN*_*Ben 4

这是一个很难的问题,涉及numpy广播和groupby+ transform,我在这里使用first,因为first会选取第一个NaN不值

s=df.values
t=np.all((s==s[:,None])|np.isnan(s),-1)
idx=pd.DataFrame(t).where(t).stack().index
# we get the pair for each row
df=df.reindex(idx.get_level_values(1))
# reorder our df to the idx we just get 
df.groupby(level=[0]).transform('first').groupby(level=1).first()
# using two times groupby with first , get what we need .
Out[217]: 
   col1  col2  col3  col4
0   3.0   4.0   7.0   7.0
1   2.0   3.0   8.0   8.0
2   8.0   6.0   9.0   9.0
3   4.0   NaN   NaN   NaN
4   2.0   3.0   8.0   8.0
5   3.0   4.0   7.0   7.0
6   NaN   5.0   7.0   6.0
Run Code Online (Sandbox Code Playgroud)