我有一个包含多个列的DataFrame,每个列在不同的索引位置包含NaN值。索引是5分钟频率的日期时间。
采用第一列:选择行,直到第一个NaN行,或者直到相邻的NaN值彼此紧随为止,直到第一个NaN范围。
我想从值序列中预测NaN值或NaN值。
下一个迭代:从开始选择行,直到下一个NaN值或NaN相邻范围,然后还选择NaN值/范围。预测NaN值/范围。
一直持续到该列不包含NaN。
import pandas as pd
import numpy as np
column = ['values']
data = [1,2,3,4, np.nan, 6, 7, 8, np.nan, np.nan, np.nan, 12, 13, 14, np.nan, np.nan, 17, 18]
DateList_ = pd.date_range(start='2018-10-29 10:00:00', end='2018-10-29 11:25:00 ', freq='5T')
df_ = pd.DataFrame(data=data, columns=column, index=DateList_)
第一次迭代:值= [1,2,3,4],nan_periods = 1->根据值预测[5]
第二次迭代:值= [1,2,3,4,5,6,7,8] nan_periods = 3->根据值预测[9,10,11]
第三次迭代:值= [1,2,3,4,5,6,7,8,9,10,11,12,13,14]->根据值预测[15,16]
迭代停止,没有更多的NaN值。
预言是由先知完成的。我想向选择部分寻求帮助,以迭代方式选择包含值的行以及以下nan / s。
不幸的是,我不能使用插值!我拥有的实际序列要复杂得多,而不是像这个虚拟示例那样线性的!此示例仅用于演示选择!
答案 0 :(得分:1)
想法是在NaN
Series
中创建具有连续g
的组,然后按groupby
循环并获取预测变量,根据位置选择是必要的,{{ 3}}(按组的第一个值)和列名中的位置,然后按loc
设置值以替换NaN
:
s = df_['values'].isna()
g = s.ne(s.shift()).cumsum()[s]
for i, x in df_.groupby(g):
nan_periods = len(x)
values = df_.iloc[:df_.index.get_loc(x.index[0]), df_.columns.get_loc('values')]
print (nan_periods)
print (values)
#sample data
Forecast = 10
df_.loc[x.index, 'values'] = Forecast
print (df_)
values
2018-10-29 10:00:00 1.0
2018-10-29 10:05:00 2.0
2018-10-29 10:10:00 3.0
2018-10-29 10:15:00 4.0
2018-10-29 10:20:00 10.0
2018-10-29 10:25:00 6.0
2018-10-29 10:30:00 7.0
2018-10-29 10:35:00 8.0
2018-10-29 10:40:00 10.0
2018-10-29 10:45:00 10.0
2018-10-29 10:50:00 10.0
2018-10-29 10:55:00 12.0
2018-10-29 11:00:00 13.0
2018-10-29 11:05:00 14.0
2018-10-29 11:10:00 10.0
2018-10-29 11:15:00 10.0
2018-10-29 11:20:00 17.0
2018-10-29 11:25:00 18.0