Python / Pandas: заполните NaN порядковой линейной интерполяцией -> ffill -> bfill

#python #pandas #interpolation #nan #missing-data

#python #pandas #интерполяция #nan #отсутствуют данные

Вопрос:

У меня есть df :

      company  year      revenues
0  company 1  2019   1,425,000,000
1  company 1  2018   1,576,000,000
2  company 1  2017   1,615,000,000
3  company 1  2016   1,498,000,000
4  company 1  2015   1,569,000,000
5  company 2  2019             nan
6  company 2  2018   1,061,757,075
7  company 2  2017             nan
8  company 2  2016     573,414,893
9  company 2  2015     599,402,347

 

Я хотел бы fill nan получить значения с порядком. Я хочу сначала выполнить линейную интерполяцию, затем прямое заполнение, а затем обратное заполнение. В настоящее время у меня есть:

 f_2_impute = [x for x in cl_data.columns if cl_data[x].dtypes != 'O' and 'total' not in x and 'year' not in x]

def ffbf(x):
    return x.ffill().bfill()

group_with = ['company']

for x in cl_data[f_2_impute]:
    cl_data[x] = cl_data.groupby(group_with)[x].apply(lambda fill_it: ffbf(fill_it))
 

который выполняет ffill() и bfill() . В идеале я хочу функцию, которая сначала пытается линейно интегрировать недостающие значения, затем пытается заполнить их вперед, а затем заполнить их в обратном направлении.

Любые быстрые способы его достижения? Заранее благодарю вас.

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

1. pandas.pydata.org/pandas-docs/stable/reference/api/…

Ответ №1:

Я считаю, что вам нужно сначала преобразовать столбцы в значения с плавающей запятой, если , есть:

 df = pd.read_csv(file, thousands=',')
 

Или:

 df['revenues'] = df['revenues'].replace(',','', regex=True).astype(float)
 

а затем добавьте DataFrame.interpolate :

 def ffbf(x):
    return x.interpolate().ffill().bfill()
 

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

1. если у меня установлен этот параметр, pd.options.display . float_format = ‘{:,.2f}’.format, я не думаю, что мне все еще нужно заменить ‘,’ верно?

2. @sophods — Если это только diplay, то нет 😉