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

时间:2017-07-19 23:26:55

标签: python pandas diff nan

我需要为每行忽略缺失值(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值。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

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

根据定义,item == item将失败任何比较操作。 NanNaN == NaN; False也是NaN != NaN。如果您包含时间必须与自身相等的条件,则会过滤掉FalseNan条目。

这足以让你继续吗?

答案 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