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