pandas の interpolate()
を使うと NaN (欠損値) を前後の値を使って穴埋めすることができます。
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.interpolate.html
以下のデータを使っていきます。
import numpy as np
import pandas as pd
df = pd.DataFrame({'col_1': [0, 1, 2, np.nan,4, np.nan, np.nan, 5],
'col_2': ['foo', np.nan,'bar', 'val', 'foo', np.nan,'bar', 'val'],})
df
col_1 | col_2 | |
---|---|---|
0 | 0.0 | foo |
1 | 1.0 | NaN |
2 | 2.0 | bar |
3 | NaN | val |
4 | 4.0 | foo |
5 | NaN | NaN |
6 | NaN | bar |
7 | 5.0 | val |
interpolate()
で穴埋めします。
df.interpolate()
col_1 | col_2 | |
---|---|---|
0 | 0.000000 | foo |
1 | 1.000000 | NaN |
2 | 2.000000 | bar |
3 | 3.000000 | val |
4 | 4.000000 | foo |
5 | 4.333333 | NaN |
6 | 4.666667 | bar |
7 | 5.000000 | val |
数値が前後の値から穴埋めされているのがわかるかと思います。
(文字列は NaN のままです。)
また、デフォルトでは、引数 : method='linear' ですので線形補間されています。
前(上)の値 or 後ろ(下)の値で穴埋めしたい場合は引数に ffill
, bfill
を指定します。
df.interpolate('ffill')
col_1 | col_2 | |
---|---|---|
0 | 0.0 | foo |
1 | 1.0 | foo |
2 | 2.0 | bar |
3 | 2.0 | val |
4 | 4.0 | foo |
5 | 4.0 | foo |
6 | 4.0 | bar |
7 | 5.0 | val |
df.interpolate('bfill')
前(上)の値 or 後ろ(下)の値で穴埋めしたい場合は引数に ffill
, bfill
を指定します。