Заполните пропущенные значения, используя данные климатологии, за исключением текущего года

#python #pandas

#python #pandas

Вопрос:

 df.groupby([df.index.month, df.index.day])[vars_rs].transform(lambda y: y.fillna(y.median()))
  

Я заполняю пропущенные значения во фрейме данных средними значениями из климатологии. Дни варьируются с 1 января 2010 года по 31 декабря 2016 года. Однако я хочу заполнить пропущенные значения только за несколько дней до текущей даты (скажем, 1 октября 2016 года). Как мне изменить инструкцию?

Ответ №1:

Алгоритм будет:

  1. Получите часть фрейма данных, которая содержит только строки, отфильтрованные по дате с помощью логической маски
  2. Выполните необходимые замены
  3. Добавьте остальную часть исходного фрейма данных в конец результирующего фрейма данных.

Фиктивные данные:

 df = pd.DataFrame(np.zeros((5, 2)),columns=['A', 'B'],index=pd.date_range('2000',periods=5,freq='M'))

            A   B
2000-01-31  0.0 0.0
2000-02-29  0.0 0.0
2000-03-31  0.0 0.0
2000-04-30  0.0 0.0
2000-05-31  0.0 0.0
  

Код

 vars_rs = ['A', 'B']
mask = df.index < '2000-03-31'
early = df[mask]
early = early.groupby([early.index.month, early.index.day])[vars_rs].transform(lambda y: y.replace(0.0, 1))  # replace with your code
result = early.append(df[~mask])
  

Таким образом, результат

             A   B
2000-01-31  1.0 1.0
2000-02-29  1.0 1.0
2000-03-31  0.0 0.0
2000-04-30  0.0 0.0
2000-05-31  0.0 0.0
  

Ответ №2:

Использование np.where , пример:

 import pandas as pd
import numpy as np
df = pd.DataFrame({'A':['a','a','b','b','c','c'],'B':[1,2,3,4,5,6],'C':[1,np.nan,np.nan,np.nan,np.nan,np.nan]})
df.ix[:,'C'] = np.where((df.A != 'c')amp;(df.B < 4)amp;(pd.isnull(df.C)),-99,df.ix[:,'C'])
  

Таким образом, вы можете напрямую изменять нужный столбец, используя логические выражения и все столбцы.

Исходный фрейм данных:

    A  B    C
0  a  1  1.0
1  a  2  NaN
2  b  3  NaN
3  b  4  NaN
4  c  5  NaN
5  c  6  NaN
  

Измененный фрейм данных:

    A  B     C
0  a  1   1.0
1  a  2 -99.0
2  b  3 -99.0
3  b  4   NaN
4  c  5   NaN
5  c  6   NaN