Заполнение пропусков с Pandas
Рассмотрим, основные способы заполнения пропусков с Pandas. В демонстрационных целях создадим датафрейм:
import pandas as pd
import numpy as np
df = pd.DataFrame({'gr':[1,2,1,2,2,2,1],
'month':[pd.Period('2021-01', freq='M'), pd.Period('2021-01', freq='M'),
pd.Period('2021-05', freq='M'), pd.Period('2021-05', freq='M'),
pd.Period('2021-04', freq='M'), pd.Period('2021-02', freq='M'),
pd.Period('2021-08', freq='M')],
'val1':[np.nan, 6, 3, np.nan, np.nan, 8, -5],
'val2':[1, np.nan, 3, 2, -9, 3, np.nan],
'val3':[0, np.nan, 1, 1, 1, 1, np.nan]}, index=['one', 'two', 'three', 'four', 'five',
'six', 'seven'])
dfЗаполнение чаще всего осуществляется с помощью метода fillna. Распространенным способом является вставка на место пропусков некоторого фиксированного значения (в fillna можно передать словарь, в котором указать для каждого столбца такое значение):
df.fillna({'val1':1, 'val2':2})Также популярно заполнение значениями из предшествующей (аргумент method='bfill') либо последующей записи (method='ffill'):
df.fillna(method='bfill')
Следует отметить, что для аналогичных действий имеются специальные методы с названиями bfill и ffill:
df.ffill()
Более сложным кейсом является заполнение значений с учетом группы, к которой принадлежит объект. Например, пусть она определяется колонкой 'gr', а время столбцом 'month', и вы хотите заполнить пропуски более ранними значениями в колонках. Тогда сначала отсортируйте датафрейм по дате:
df.sort_values(by='month', inplace=True) df
После аналогичные методы можно вызывать на сгруппированных объектах:
df.groupby('gr')[['val1', 'val2']].ffill()df.groupby('gr')[['val1', 'val2']].fillna(method='ffill')Распространенным вариантом является заполнение в одну сторону, затем в другую. Это можно сделать с методом apply:
df.groupby('gr')[['val1', 'val2']].apply(lambda x: x.bfill().ffill())df.groupby('gr')[['val1', 'val2']].transform(lambda x: x.bfill().ffill())Не пропустите ничего интересного и подписывайтесь на страницы канала в других социальных сетях: