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

时间:2019-05-08 16:44:38

标签: python pandas data-science

我有下表。一些值为NaN。让我们假设列是高度相关的。以row 0row 5为例,我说col2中的值为4.0row 1row 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]})

输出:

    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

1 个答案:

答案 0 :(得分:3)

这是一个棘手的问题,涉及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