使用不同方法填充缺失数据

时间:2015-01-29 05:41:04

标签: python pandas

我有一组带有时间戳,值和质量标志的数据。某些时间戳缺少值和质量标志,需要依赖于周围数据。即,

  • 如果包围NaN数据的有效数据上的质量标志不同,则将值和质量标志设置为与具有最高质量标志的包围行相同。在下面的示例中,第一组NaN将替换为qf = 3和value = 3.
  • 如果质量标志相同,则在两侧的两个有效值之间插值。在该示例中,第二组NaN将被qf = 1和v = 6和9替换。

代码:

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行并循环遍历它们来解决这个问题,修复第一个标准,然后使用插值来解决第二个问题。但是,当我使用大型设备时,这非常慢。

1 个答案:

答案 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秒。根据您的要求,可能就足够了。