因此,这里有一个面具可以解决这个问题。只需
interpolate然后应用蒙版将适当的值重置为NaN。老实说,这比我意识到的工作要多得多,因为我不得不遍历每列,但是如果没有我提供一些像“
ones”这样的虚拟列,groupby就无法工作。
无论如何,我可以解释是否有任何不清楚的地方,但实际上只有几行很难理解。有关更多信息,请参见此处,以获取更多有关该技巧的解释,
df['new']或者仅打印出单独的一行以更好地了解发生了什么。
mask = data.copy()for i in list('abcdefgh'): df = pd.Dataframe( data[i] ) df['new'] = ((df.notnull() != df.shift().notnull()).cumsum()) df['ones'] = 1 mask[i] = (df.groupby('new')['ones'].transform('count') < 5) | data[i].notnull()In [7]: dataOut[7]: a b c d e f g h2014-02-21 14:50:00 123.5 433.5 123.5 NaN NaN NaN 2330.3 2330.32014-02-21 14:51:00 NaN 523.2 132.3 NaN NaN NaN NaN NaN2014-02-21 14:52:00 136.3 536.3 136.3 NaN NaN NaN NaN NaN2014-02-21 14:53:00 164.3 464.3 164.3 NaN NaN NaN NaN NaN2014-02-21 14:54:00 213.0 413.0 NaN NaN NaN 2763.0 NaN NaN2014-02-21 14:55:00 164.3 164.3 NaN NaN NaN 2142.3 NaN NaN2014-02-21 14:56:00 213.0 213.0 NaN NaN NaN 2127.3 NaN NaN2014-02-21 14:57:00 221.1 221.1 NaN NaN 2330.3 2330.3 NaN 2777.7In [8]: maskOut[8]: a b c d e f g h2014-02-21 14:50:00 True True True False False True True True2014-02-21 14:51:00 True True True False False True False False2014-02-21 14:52:00 True True True False False True False False2014-02-21 14:53:00 True True True False False True False False2014-02-21 14:54:00 True True True False False True False False2014-02-21 14:55:00 True True True False False True False False2014-02-21 14:56:00 True True True False False True False False2014-02-21 14:57:00 True True True False True True False True
如果您对推断没有任何幻想,那么从那里开始很容易:
In [9]: data.interpolate().bfill()[mask]Out[9]: a b c d e f g h2014-02-21 14:50:00 123.5 433.5 123.5 NaN NaN 2763.0 2330.3 2330.32014-02-21 14:51:00 129.9 523.2 132.3 NaN NaN 2763.0 NaN NaN2014-02-21 14:52:00 136.3 536.3 136.3 NaN NaN 2763.0 NaN NaN2014-02-21 14:53:00 164.3 464.3 164.3 NaN NaN 2763.0 NaN NaN2014-02-21 14:54:00 213.0 413.0 164.3 NaN NaN 2763.0 NaN NaN2014-02-21 14:55:00 164.3 164.3 164.3 NaN NaN 2142.3 NaN NaN2014-02-21 14:56:00 213.0 213.0 164.3 NaN NaN 2127.3 NaN NaN2014-02-21 14:57:00 221.1 221.1 164.3 NaN 2330.3 2330.3 NaN 2777.7
编辑添加: 通过将一些内容移出循环,这是一种更快的方法(此示例数据的大约两倍),并且稍微简单一些:
mask = data.copy()grp = ((mask.notnull() != mask.shift().notnull()).cumsum())grp['ones'] = 1for i in list('abcdefgh'): mask[i] = (grp.groupby(i)['ones'].transform('count') < 5) | data[i].notnull()
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)