2017-07-19 157 views
1

我需要计算每行忽略缺失值(NaN)沿轴= 1的元素之间的差异。例如:在.diff()中忽略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 

所以,理想情况下,我需要得到:

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(轴= 1),并得到了我所需要的。不过,我努力从每一行中提取非NaN值。有任何想法吗?

+0

你可以使用带有条件'项过滤== item'? 'NaN'将无法与自身进行比较。 – Prune

+0

你能提供[mcve]吗? –

+0

@Prune,你能解释一下吗? –

回答

1

我打算使用np.argsort关于nullness的真值与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 
2

我假设你已经知道如何在填入所有值时计算差异。使用该过程,但修改比较步骤。无论您使用什么来比较现有值,都包括一个筛选器,以便只接受item s,其中item == item

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

这足以让你继续吗?

+0

我有点困惑,因为我通常不区分运行比较。我明白你的意思,但是,我看不到在我的情况下过滤的步骤。 –

+0

你可以用你用于“正常”的代码编辑你的帖子吗?这将有助于重点解答。 – Prune