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

6
我有以下表格。一些值是NaN。假设列之间高度相关。以row 0row 5为例,我说col2中的值将是4.0。对于row 1row 4也是同样的情况。但是在row 6的情况下,没有完全匹配的样本,因此我应该选择最相似的行-在这种情况下,是row 0并将NaN更改为3.0。我该怎么做?有没有任何pandas函数可以实现这个功能?
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
你能更具体地解释一下“相似”是什么意思吗?它只是行之间总和的最小差异吗? - Edeki Okoh
1
这个问题的挑战在于定义“最相似”行的含义。一种方法是选择所有非NaN值之间平方差的和最小的行。 - Chris Mueller
数据科学高度领域特定。数据类型、应用类型和问题陈述将决定您必须采取什么样的行动。在许多情况下,您可能希望完全删除NaN值。或者有时,您可能希望用特征的中位数或平均值替换它们。如果您使用高级算法,它们可能会自行处理缺失值。 - jukebox
@EdekiOkoh 没错,我认为是欧几里得距离。 - MarkAlanFrank
1
@MarkAlanFrank 这篇文章可能会有所帮助。它提供了一些示例,也许学习这些示例可以帮助你处理 NaN 值。 - jukebox
显示剩余2条评论
1个回答

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接