2015-08-12 3 views
1

Я испытываю это много в моделях временных рядов. Иногда вы можете получать данные на разных частотах, например, один раз в день и один раз в неделю. Я бы хотел, чтобы не пересылать еженедельные данные за каждый день недели (так как обычно это сумма всех значений за неделю), но пересылайте заполнение или замену данных на это. В сущности, я бы хотел, чтобы разложил данные.Вперед заполнить столбец pandas не последним значением, но со средним значением по ненулевым и нулевым элементам

Так что, если у меня есть

s = pd.Series(index=pd.date_range('2015/1/1', '2015/1/9'), 
      data=[2, np.nan, 6, np.nan, np.nan, 2, np.nan, np.nan, np.nan]) 

, то я хотел бы вернуться

2015-01-01  1 
2015-01-02  1 
2015-01-03  2 
2015-01-04  2 
2015-01-05  2 
2015-01-06 0.5 
2015-01-07 0.5 
2015-01-08 0.5 
2015-01-09 0.5 
Freq: D, dtype: float64 

Любые мысли о простой способ сделать это? Является ли for-loop неизбежным?

ответ

3

Это один из способов использования .cumcount, чтобы отделить серию от разных групп, а затем transform.

s.fillna(method='ffill').groupby(s.notnull().cumsum()).transform(lambda g: g/len(g)) 

2015-01-01 1.0 
2015-01-02 1.0 
2015-01-03 2.0 
2015-01-04 2.0 
2015-01-05 2.0 
2015-01-06 0.5 
2015-01-07 0.5 
2015-01-08 0.5 
2015-01-09 0.5 
Freq: D, dtype: float64 
+0

Очень умный! Благодаря! – santon

Смежные вопросы