我的数据每行中的最后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个实数的位置可能因行而异。使原始数据框看起来像上面示例中的新数据框。
答案 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
这不是很漂亮,但是如果我们需要针对每一行进行不同的转换,那么将允许更精细的自定义级别,例如,如果我们有一行非空值,则不是这样。后跟空值。