根据条件从DataFrame中选择行

时间:2019-05-15 10:11:53

标签: python pandas

我有一个包含多个列的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。

不幸的是,我不能使用插值!我拥有的实际序列要复杂得多,而不是像这个虚拟示例那样线性的!此示例仅用于演示选择!

1 个答案:

答案 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