使用 Pandas 忽略 .diff() 中的 NaN
ignore NaN in .diff() with Pandas
我需要为忽略缺失值 (NaN) 的每一行计算沿 axis=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 值。有什么想法吗?
我假设您已经知道如何在填写所有值时计算差异。使用该过程,但修改比较步骤。无论您使用什么来比较现有值,都包含一个过滤器以仅接受 item
的 item == item
.
根据定义,Nan
将使 any 比较操作失败。 NaN == NaN
是 False
; NaN != NaN
也是 False
。如果包含时间必须等于自身的条件,则过滤掉 Nan
和 Inf
条目。
这足以让你继续吗?
我将使用 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.]]
然后我将删除包含所有空值的列并放回数据框中
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
我需要为忽略缺失值 (NaN) 的每一行计算沿 axis=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 值。有什么想法吗?
我假设您已经知道如何在填写所有值时计算差异。使用该过程,但修改比较步骤。无论您使用什么来比较现有值,都包含一个过滤器以仅接受 item
的 item == item
.
根据定义,Nan
将使 any 比较操作失败。 NaN == NaN
是 False
; NaN != NaN
也是 False
。如果包含时间必须等于自身的条件,则过滤掉 Nan
和 Inf
条目。
这足以让你继续吗?
我将使用 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.]]
然后我将删除包含所有空值的列并放回数据框中
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