我真的是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)
你们有什么干净的方法可以做到这一点?
答案 0 :(得分:1)
您应该可以使用interpolate函数-
df.interpolate(method ='linear', limit_direction ='forward')
,如果可能,它将尝试以您正在寻找的方式填写数据。 (在列的开头和结尾使用NaN值不太有效)