使用 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 值。有什么想法吗?

我假设您已经知道如何在填写所有值时计算差异。使用该过程,但修改比较步骤。无论您使用什么来比较现有值,都包含一个过滤器以仅接受 itemitem == item.

根据定义,Nan 将使 any 比较操作失败。 NaN == NaNFalseNaN != NaN 也是 False。如果包含时间必须等于自身的条件,则过滤掉 NanInf 条目。

这足以让你继续吗?

我将使用 np.argsortmergesort 的空性真值来确保我保留非空值的顺序。

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