用最相似行中的值填充缺失值
Posted
技术标签:
【中文标题】用最相似行中的值填充缺失值【英文标题】:Filling missing values with values from most similar row 【发布时间】:2019-09-26 11:08:46 【问题描述】:我有下表。一些值是 NaN。让我们假设列是高度相关的。取row 0
和row 5
我说col2
中的值将是4.0
。 row 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])
输出:
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)——删除法填充法插值法