使用 Pandas 忽略 .diff() 中的 NaN

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 值。有任何想法吗?

piR*_*red 1

我将使用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)