Применяйте fillna(метод=’bfill’) только в том случае, если значения в том же году и месяце с Python

#python #python-3.x #pandas #dataframe #numpy

Вопрос:

Допустим, у меня есть фрейм данных панели с большим количеством NaN s внутри, как показано ниже:

 import pandas as pd import numpy as np  np.random.seed(2021) dates = pd.date_range('20130226', periods=720) df = pd.DataFrame(np.random.randint(0, 100, size=(720, 3)), index=dates, columns=list('ABC')) for col in df.columns:  df.loc[df.sample(frac=0.4).index, col] = pd.np.nan df  

Из:

 A B C 2013-02-26 NaN NaN NaN 2013-02-27 NaN NaN 44.0 2013-02-28 62.0 NaN 29.0 2013-03-01 21.0 NaN 24.0 2013-03-02 12.0 70.0 70.0  ... ... ... 2015-02-11 38.0 42.0 NaN 2015-02-12 67.0 NaN NaN 2015-02-13 27.0 10.0 74.0 2015-02-14 18.0 NaN NaN 2015-02-15 NaN NaN NaN  

Мне нужно применить df.fillna(method='bfill') или df.fillna(method='ffill') к фрейму данных, только если они находятся в одном и том же year и month :

Например, если я подам df.fillna(method='bfill') заявку , ожидаемый результат будет таким:

 A B C 2013-02-26 62.0 NaN 44.0 2013-02-27 62.0 NaN 44.0 2013-02-28 62.0 NaN 29.0 2013-03-01 21.0 70.0 24.0 2013-03-02 12.0 70.0 70.0  ... ... ... 2015-02-11 38.0 42.0 74.0 2015-02-12 67.0 10.0 74.0 2015-02-13 27.0 10.0 74.0 2015-02-14 18.0 NaN NaN 2015-02-15 NaN NaN NaN  

Как я мог сделать это в Панд? Спасибо.

Ответ №1:

Вы могли resample бы к M (месяцу) и transform bfill :

 gt;gt;gt; df.resample("M").transform('bfill')  A B C 2013-02-26 62.0 NaN 44.0 2013-02-27 62.0 NaN 44.0 2013-02-28 62.0 NaN 29.0 2013-03-01 21.0 70.0 24.0 2013-03-02 12.0 70.0 70.0 ... ... ... ... 2015-02-11 38.0 42.0 74.0 2015-02-12 67.0 10.0 74.0 2015-02-13 27.0 10.0 74.0 2015-02-14 18.0 NaN NaN 2015-02-15 NaN NaN NaN  [720 rows x 3 columns] gt;gt;gt;   

Для определенных столбцов:

 gt;gt;gt; df[['A', 'B']] = df.resample("M")[['A', 'B']].transform('bfill') gt;gt;gt; df  A B C 2013-02-26 62.0 NaN NaN 2013-02-27 62.0 NaN 44.0 2013-02-28 62.0 NaN 29.0 2013-03-01 21.0 70.0 24.0 2013-03-02 12.0 70.0 70.0 ... ... ... ... 2015-02-11 38.0 42.0 NaN 2015-02-12 67.0 10.0 NaN 2015-02-13 27.0 10.0 74.0 2015-02-14 18.0 NaN NaN 2015-02-15 NaN NaN NaN  [720 rows x 3 columns] gt;gt;gt;   

Комментарии:

1. Спасибо, я подумываю о том, чтобы извлечь year-month , затем сгруппировать его и заполнить, но ваше решение кажется гораздо более кратким.

2. Если я хочу заполнить только определенные столбцы, т. Е. Столбцы A и B только?

3. @ahbon Проверь мою правку