通过比较最近的已知值和NaN行之前的第一个已知值来填充行NaN值

时间:2019-10-22 09:32:25

标签: python pandas data-science

我真的是Python和Datascience的新手。

我有一个包含100K +行的数据集,该数据集上有两列。

第一个是Datetime列,我们将其命名为A,最后一个是Integer,将其命名为B

我的数据集按A列排序。

在我的数据集中,某些B值为NaN。

我想通过以下方式填写我的NaN值:

对于具有NaN B值的第i行:     如果(我的第i行之前没有NaN B值-我的第i行之后没有NaN B值)== 0,则将第i行的B值设置为“我的第i行没有最新的NaN B值”     否则将其设置为“我的行i之前没有NaN B的最新值”-“我的行i之前没有NaN B的最新值”与我的行i的A列之间的秒数差异

让我用一个例子来解释一下自己:

我的数据集如下:

                     A     B
0  2019-03-13 08:12:20  10.0
1  2019-03-13 08:12:21   NaN
2  2019-03-13 08:12:22   NaN
3  2019-03-13 08:12:23  10.0
4  2019-03-13 08:12:24   NaN
5  2019-03-13 08:12:25   NaN
6  2019-03-13 08:12:26   7.0

最后,我希望它看起来像这样:

                     A     B
0  2019-03-13 08:12:20  10.0
1  2019-03-13 08:12:21  10.0
2  2019-03-13 08:12:22  10.0
3  2019-03-13 08:12:23  10.0
4  2019-03-13 08:12:24   9.0
5  2019-03-13 08:12:25   8.0
6  2019-03-13 08:12:26   7.0

(行ID的B列= 1)和(行ID的B列= 2)为10,因为(行ID的B列== 0)=(行ID的B列= 3)。 (行ID = 4的B列)为9,因为(行ID = 3的B列)= / =(行ID = 6的B列)和(行ID = 3的B列)-(time_diff(行ID = 3,行ID = 4的A列)。

我能做的最好的就是将NaN设置为最新的已知值,但这并不是我想要的。

df=pd.DataFrame({'A': ["2019-03-13 08:12:20", "2019-03-13 08:12:21", "2019-03-13 08:12:22", "2019-03-13 08:12:23", "2019-03-13 08:12:24", "2019-03-13 08:12:25"], 'B': [10, 10, 10, 9, 8, 7]})
df['B'] = df['B'].replace({'B': {0: np.nan}}).ffill()
print(df)

你们有什么干净的方法可以做到这一点?

1 个答案:

答案 0 :(得分:1)

您应该可以使用interpolate函数-

df.interpolate(method ='linear', limit_direction ='forward') 

,如果可能,它将尝试以您正在寻找的方式填写数据。 (在列的开头和结尾使用NaN值不太有效)