#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:
Алгоритм будет:
- Получите часть фрейма данных, которая содержит только строки, отфильтрованные по дате с помощью логической маски
- Выполните необходимые замены
- Добавьте остальную часть исходного фрейма данных в конец результирующего фрейма данных.
Фиктивные данные:
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