Arn*_*ein 5 python diff nan pandas
我需要计算每行沿 axis=1 的元素之间的差异,忽略缺失值 (NaN)。例如:
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
Run Code Online (Sandbox Code Playgroud)
所以,理想情况下我需要得到:
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
Run Code Online (Sandbox Code Playgroud)
然后我可以应用标准 .diff(axis=1) 并得到我需要的东西。但是,我正在努力从每一行中提取非 NaN 值。有任何想法吗?
我将使用np.argsort空值的真值来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.]]
Run Code Online (Sandbox Code Playgroud)
然后我将删除所有空值的列并放回到数据框中
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
Run Code Online (Sandbox Code Playgroud)