前提・実現したいこと
以下のようなデータフレームの,欠測値の内挿を行いたいです.
そして更に,この時系列データを内挿するのに,**「欠測が1つだけ存在する場合のみ線形内挿する」**という条件を付与したいのです.
python
1df = pd.DataFrame({"田中_身長":[129, pd.np.nan, 120, 133.4, 132, 150.5, 200.5], 2 "田中_体重":[29, 29.5, pd.np.nan, pd.np.nan, pd.np.nan, 50.5, 200], 3 "山田_身長":[180.6, 180.5, pd.np.nan, 177.3, 169, 170.2, 160.5], 4 "山田_体重":[80.6, 80.5, 81, pd.np.nan, 69, 70.2, 60.5]}, 5 index=pd.date_range('2016/01/01 00:00', freq='1Y', periods=7))
具体例
上により作成される時系列データは
- | 田中_身長 | 田中_体重 | 山田_身長 | 山田_体重 |
---|---|---|---|---|
2016-12-31 | 129 | 29 | 180.6 | 80.6 |
2017-12-31 | NaN | 29.5 | 180.5 | 80.5 |
2018-12-31 | 120 | NaN | NaN | 81 |
2019-12-31 | 133.4 | NaN | 177.3 | NaN |
2020-12-31 | 132 | NaN | 169 | 69 |
2021-12-31 | 150.5 | 50.5 | 170.2 | 70.2 |
2022-12-31 | 200.5 | 200 | 160.5 | 60.5 |
となりますが,これを条件通りに内挿し,以下のようなデータフレームを作成します.
- | 田中_身長 | 田中_体重 | 山田_身長 | 山田_体重 |
---|---|---|---|---|
2016-12-31 | 129 | 29 | 180.6 | 80.6 |
2017-12-31 | 124.5 | 29.5 | 180.5 | 80.5 |
2018-12-31 | 120 | NaN | 178.9 | 81 |
2019-12-31 | 133.4 | NaN | 177.3 | 75 |
2020-12-31 | 132 | NaN | 169 | 69 |
2021-12-31 | 150.5 | 50.5 | 170.2 | 70.2 |
2022-12-31 | 200.5 | 200 | 160.5 | 60.5 |
このように,2つ以上欠測が連続した場合,内挿をしないようにします.
発生している問題
内挿するために以下の処理を行いました.
python
1df.interpolate(limit=1, method="time", limit_area='inside', limit_direction="backward")
しかし,このような書き方をしても,以下のような結果となり,うまくいきません(山田の2020年の体重が線形内挿されてしまっています).
- | 田中_身長 | 田中_体重 | 山田_身長 | 山田_体重 |
---|---|---|---|---|
2016-12-31 | 129 | 29 | 180.6 | 80.6 |
2017-12-31 | 124.5 | 29.5 | 180.5 | 80.5 |
2018-12-31 | 120 | NaN | 178.9 | 81 |
2019-12-31 | 133.4 | NaN | 177.3 | 75 |
2020-12-31 | 132 | 45.25 | 169 | 69 |
2021-12-31 | 150.5 | 50.5 | 170.2 | 70.2 |
2022-12-31 | 200.5 | 200 | 160.5 | 60.5 |
limitの意味合い的に正しい挙動なのは分かりますが,正しい答えを導く方法が分かりません.
rollingやresampleなども使って見ようと思いましたが,良いやり方が思いつきません.
どのようにするのが良いのでしょうか.ループを書いて一行一行処理するのは,Pythonっぽくない書き方で避けたいと思います.
よろしくお願いいたします.
回答3件
あなたの回答
tips
プレビュー