Mar*_*ank 6 python pandas data-science
我有下表。一些值为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]})
Run Code Online (Sandbox Code Playgroud)
输出:
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
Run Code Online (Sandbox Code Playgroud)
这是一个很难的问题,涉及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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
65 次 |
| 最近记录: |