我需要为每行忽略缺失值(NaN)计算沿轴= 1的元素之间的差异。例如:
0 1 2 3 4 5
20 NaN 7.0 5.0 NaN NaN 8.0
21 7.0 5.0 NaN NaN 8.0 NaN
22 5.0 NaN NaN 8.0 NaN 7.0
23 NaN NaN 8.0 NaN 7.0 NaN
24 NaN 8.0 NaN 7.0 NaN 10.0
25 8.0 NaN 7.0 NaN 10.0 NaN
26 NaN 7.0 NaN 10.0 NaN NaN
27 7.0 NaN 10.0 NaN NaN 9.0
28 NaN 10.0 NaN NaN 9.0 6.0
29 10.0 NaN NaN 9.0 6.0 6.0
所以,理想情况下我需要得到:
7.0 5.0 8.0
7.0 5.0 8.0
5.0 8.0 7.0
8.0 7.0
8.0 7.0 10.0
然后我可以应用标准的.diff(axis = 1)并得到我需要的东西。但是,我正努力从每一行中提取非NaN值。有什么想法吗?
答案 0 :(得分:2)
我假设您已经知道在填写所有值时如何计算差异。使用该过程,但修改比较步骤。无论您使用什么来比较现有值,都应包含一个过滤器,仅接受item
的{{1}}。
根据定义,item == item
将失败任何比较操作。 Nan
是NaN == NaN
; False
也是NaN != NaN
。如果您包含时间必须与自身相等的条件,则会过滤掉False
和Nan
条目。
这足以让你继续吗?
答案 1 :(得分:1)
我将使用np.argsort
对{-1}}的null-ness的真值使用mergesort
,以确保我保留非空值的顺序。
v = df.values
a = (~np.isnan(v)).argsort(1, kind='mergesort')
b = v[np.arange(a.shape[0])[:, None], a]
b
[[ nan nan nan 7. 5. 8.]
[ nan nan nan 7. 5. 8.]
[ nan nan nan 5. 8. 7.]
[ nan nan nan nan 8. 7.]
[ nan nan nan 8. 7. 10.]
[ nan nan nan 8. 7. 10.]
[ nan nan nan nan 7. 10.]
[ nan nan nan 7. 10. 9.]
[ nan nan nan 10. 9. 6.]
[ nan nan 10. 9. 6. 6.]]
然后我会删除包含所有空值的列并将其放回数据帧
pd.DataFrame(b[:, ~np.isnan(b).all(0)], df.index)
0 1 2 3
20 NaN 7.0 5.0 8.0
21 NaN 7.0 5.0 8.0
22 NaN 5.0 8.0 7.0
23 NaN NaN 8.0 7.0
24 NaN 8.0 7.0 10.0
25 NaN 8.0 7.0 10.0
26 NaN NaN 7.0 10.0
27 NaN 7.0 10.0 9.0
28 NaN 10.0 9.0 6.0
29 10.0 9.0 6.0 6.0