【问题标题】: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值的方法。

标签: python pandas data-science


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-16
    • 1970-01-01
    • 2019-11-18
    • 1970-01-01
    • 2021-11-08
    • 2012-10-25
    相关资源
    最近更新 更多