#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 Проверь мою правку