Интерполировать значения NaN в DataFrame как кольцо - PullRequest
3 голосов
/ 13 июня 2019

Мне нужно интерполировать значения NaN по Dataframe, но я хочу, чтобы эта интерполяция получала первые значения DataFrame в случае, если значение NaN является последним значением.Вот пример:

import pandas as pd
import numpy as np
df = pd.DataFrame.from_dict({"a": [1,2,3], "b":[1,2,np.nan]})

Итак, DataFrame:

   a    b
0  1  1.0
1  2  2.0
2  3  NaN

Но когда я интерполирую значения nan, такие как:

df.interpolate(method="linear", inplace=True)

Я получил:

   a    b
0  1  1.0
1  2  2.0
2  3  2.0

Интерполяция не использует первое значение, чтобы сделать это.Мой желаемый вывод будет заполнен значением 1,5 из-за этой круговой интерполяции.

1 Ответ

2 голосов
/ 13 июня 2019

Одним из возможных решений является добавление первой строки, интерполяция и удаление последней строки:

df = df.append(df.iloc[0]).interpolate(method="linear").iloc[:-1]
print (df)
     a    b
0  1.0  1.0
1  2.0  2.0
2  3.0  1.5

EDIT:

Более общее решение:

df = pd.DataFrame.from_dict({"a": [1,2,3,4], "b":[np.nan,1,2,np.nan]})

df = pd.concat([df] * 3).interpolate(method="linear").iloc[len(df):-len(df)]

print (df)
   a         b
0  1  1.333333
1  2  1.000000
2  3  2.000000
3  4  1.666667

Или, если необходимо, работать только с последними не пропущенными значениями:

df = pd.DataFrame.from_dict({"a": [1,2,3,4], "b":[np.nan,1,2,np.nan]})

df1 = df.ffill().iloc[[-1]]
df2 = df.bfill().iloc[[0]]
df = pd.concat([df1, df, df2]).interpolate(method="linear").iloc[1:-1]

print (df)
   a    b
0  1  1.5
1  2  1.0
2  3  2.0
3  4  1.5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...