【问题标题】:Replace last 2 numeric values in pandas data frame by row with NAN's用 NAN 逐行替换 pandas 数据中的最后 2 个数值
【发布时间】:2018-04-24 11:50:09
【问题描述】:

我的数据每行中的最后 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。主要问题之一是一行中最后两个实数的位置可能因行而异。使原始数据框看起来像上面示例中的新数据框。

【问题讨论】:

  • 请添加更多插图声明。
  • 不确定你的意思
  • 你能详细说明你想做什么吗?
  • 我添加了一些说明

标签: python-3.x pandas numpy dataframe


【解决方案1】:

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

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

这不是很漂亮,但如果我们需要为每一行进行不同的移动,例如如果我们有一行非空值后跟空值不是真的,则可以实现更精细的自定义级别.

【讨论】:

    猜你喜欢
    • 2017-08-25
    • 2017-08-14
    • 1970-01-01
    • 2022-10-05
    • 2017-12-03
    • 2022-07-06
    • 2015-09-28
    • 1970-01-01
    • 2013-06-18
    相关资源
    最近更新 更多