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

Posted

技术标签:

【中文标题】用最相似行中的值填充缺失值【英文标题】:Filling missing values with values from most similar row 【发布时间】:2019-09-26 11:08:46 【问题描述】:

我有下表。一些值是 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

【问题讨论】:

你能更详细地描述你所说的相似吗?它只是行之和之间的最小差异吗? 挑战在于定义“最相似”行的含义。一种方法是所有非 NaN 值之间的平方差之和最小的行。 数据科学是高度特定领域的。数据类型、应用程序类型和问题陈述将决定您必须采取的行动。在许多情况下,您可能希望完全删除 NaN 值。或者有时,您可能希望将它们替换为特征的中值或均值。如果您使用高级算法,它们可能会自己处理缺失值。 @EdekiOkoh 没错,我认为是欧式距离 @MarkAlanFrank machinelearningmastery.com/handle-missing-data-python 这篇文章可能会有所帮助。它也有几个例子。也许研究这个可能会给你一种处理NaN值的方法。 【参考方案1】:

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

【讨论】:

以上是关于用最相似行中的值填充缺失值的主要内容,如果未能解决你的问题,请参考以下文章

如何用 NA 以外的值填充 merge(..., all = TRUE, ...) 中的缺失值?

用之前的非缺失值填充缺失的 pandas 数据,按 key 分组

数据分析缺失值处理(Missing Values)——删除法填充法插值法

熊猫:使用最后可用的填充缺失值

R语言自定义函数计算dataframe每列中的缺失值NA的个数缺失值问题及其填充示例

技巧 Pandas 数据填充