我有一组带有时间戳,值和质量标志的数据。某些时间戳缺少值和质量标志,需要依赖于周围数据。即,
代码:
import datetime
import pandas as pd
start = datetime.strptime("2004-01-01 00:00","%Y-%m-%d %H:%M")
end = datetime.strptime("2004-01-01 03:00","%Y-%m-%d %H:%M")
df = pd.DataFrame(\
data = {'v' : [1,2,'NaN','NaN','NaN',3,2,1,5,3,'NaN','NaN',12,43,23,12,32,12,12],\
'qf': [1,1,'NaN','NaN','NaN',3,1,5,1,1,'NaN','NaN',1,3,4,2,1,1,1]},\
index = pd.date_range(start, end,freq="10min"))
我试图通过找到NA行并循环遍历它们来解决这个问题,修复第一个标准,然后使用插值来解决第二个问题。但是,当我使用大型设备时,这非常慢。
答案 0 :(得分:0)
一种方法就是做所有可能的填充,然后在适当的时候选择它们。在必要时执行df = df.astype(float)
之后(您的示例使用字符串"NaN"
),这样的事情应该有效:
is_null = df.qf.isnull()
fill_down = df.ffill()
fill_up = df.bfill()
df.loc[is_null & (fill_down.qf > fill_up.qf)] = fill_down
df.loc[is_null & (fill_down.qf < fill_up.qf)] = fill_up
df = df.interpolate()
它做了比必要更多的工作,但很容易看出它做了什么,它做的工作是矢量化的,所以很快就会发生。在您的数据集版本扩展为~10M行(具有相同的空值密度),在我的旧笔记本上需要大约6秒。根据您的要求,可能就足够了。