使用NAN的行逐行替换pandas数据中的最后2个数值

时间:2018-04-24 02:34:03

标签: python-3.x pandas numpy dataframe

我的数据每行中的最后2个实数都是错误的。我想用np.NAN替换它们。实数的数量因行而不同(即,每行已经具有不同数量的一些NAN)。列标题表示测量编号,索引是实验性试验。单元格中的值等于测量读数。有些试验的测量读数比其他试验更多;因此,有些行的NAN比其他行更多。下面的代码创建了一个类似于我的数据框。

   import pandas as pd
   import numpy as np
   data = np.array(([1,2,3,4,5,2,np.NaN], 
   [2,2,3,2,3,np.NaN,np.NaN],[4,4,5,1,np.NaN,np.NaN,np.nan]))
   df1 = pd.DataFrame(data, columns = ['0','1','2','3','4','5','6'])

数据框来自与我的相似的代码:

       0    1   2   3   4   5   6
    0 1.0  2.0 3.0 4.0 5.0 2.0 NAN
    1 2.0  2.0 3.0 2.0 3.0 NAN NAN  
    2 4.0  4.0 5.0 1.0 NAN NAN NAN  

这就是我希望新数据框看起来像:

      0    1    2   3   4   5   6
    0 1.0  2.0 3.0 4.0 NAN NAN NAN
    1 2.0  2.0 3.0 NAN NAN NAN NAN  
    2 4.0  4.0 NAN NAN NAN NAN NAN      

我已经尝试过计算NAN并使用它来定位最后一个数字值和倒数第二个数字值的位置,但它不会让我在哪里。

最终,我想要做的是忽略原始数据帧中的NAN并在一行中取最后两个实数值(即整数)并用np.NAN替换它们。其中一个主要问题是连续的最后2个实数的位置可能因行而异。使原始数据框看起来像上面示例中的新数据框。

1 个答案:

答案 0 :(得分:3)

方法#1只是简单地将所有内容移动2并保持非空的值:

In [61]: df.where(df.shift(-2, axis=1).notnull())
Out[61]: 
     0    1    2    3   4   5   6
0  1.0  2.0  3.0  4.0 NaN NaN NaN
1  2.0  2.0  3.0  NaN NaN NaN NaN
2  4.0  4.0  NaN  NaN NaN NaN NaN

方法#2将从右侧计算非空值的数量,并且仅在第二个之后保留非空值:

In [62]: df.where((df.notnull().iloc[:, ::-1].cumsum(axis=1) > 2))
Out[62]: 
     0    1    2    3   4   5   6
0  1.0  2.0  3.0  4.0 NaN NaN NaN
1  2.0  2.0  3.0  NaN NaN NaN NaN
2  4.0  4.0  NaN  NaN NaN NaN NaN

这不是很漂亮,但是如果我们需要针对每一行进行不同的转换,那么将允许更精细的自定义级别,例如,如果我们有一行非空值,则不是这样。后跟空值。