本日の関数:interpolate()
こんにちは。
テービーテックの村松です。
本日ご紹介する関数は「interpolate()」。
※※これまでご紹介した関数はこちら※※
どんな関数?
データフレーム等の欠損値の補間方法の一つ。
前後の値を考慮して補間します。
沢山の補間方法が用意されています。
引数は?
DataFrame.interpolate(self, method='linear', axis=0, limit=None, inplace=False, limit_direction='forward', limit_area=None, downcast=None)
よく指定する引数は、
- method:linear(線形補間、デフォルト), time(インデックス列の日時に合わせて線形補間), index(線形補間、インデックス列(数値の場合)を考慮する), values(線形補間、インデックス列(数値の場合)を考慮する), pad(既存の数値で補間), nearest, zero, slinear, quadratic, cubic, barycentric, krogh, polynomial, spline, piecewise_polynomial, pchip。各詳細はドキュメント参照。
- axis:変換する方向の指定をします。行(1)か列(0)。
- limit:連続している欠損値を最大いくつ補間するか指定します。デフォルトはNone(全て補間)。
- limit:inplace:元のオブジェクトを補間した内容で更新するか指定します。デフォルトはFalse。
使ってみよう
input
import pandas as pd # 欠損値入りのデータフレームを用意 df = pd.DataFrame({'a': [1, pd.np.nan, pd.np.nan, 5, 6], 'b': [0, 1, 2, pd.np.nan, pd.np.nan], 'c': [pd.np.nan, 1, 3, pd.np.nan, 7], 'd': [4, 6, pd.np.nan, 10, 12]}) df
コード
#デフォルトで補間
df.interpolate()
各列に対して線形補間を行いました。
0行目は前の値がないのでNaNのままです。
また、b列のように後ろの値がない場合は同じ値が繰り返し入ります。
なお、引数limit_direction='both'とすると前の値がない個所も補間されます。
#引数limit_direction='both'で補間 df.interpolate(limit_direction='both')
デフォルトだとインデックス列を考慮せず、等間隔扱いで補完していますが、
インデックスを考慮した補間も可能です。
どのように補間の数値が変わるか不連続なインデックス列のデータフレームで試してみましょう。
# 不連続なインデックスのデータフレームを用意 df2 = pd.DataFrame({'a': [1, pd.np.nan, pd.np.nan, 5, 6], 'b': [0, 1, 2, pd.np.nan, pd.np.nan], 'c': [pd.np.nan, 1, 3, pd.np.nan, 7], 'd': [4, 6, pd.np.nan, 10, 12]}, index=[0, 2, 6, 7, 10]) df2
methodにはindexかvaluesを指定します。
# インデックス列の数値を配慮した補間。 df2.interpolate('index')
インデックス列を考慮したmethodを使用する場合はインデックスが数値型以外だとエラーになるので注意です。
methodをtimeにすれば日時を考慮した線形補間も可能です。
# インデックスが日時の場合のデータフレームを用意 df3 = pd.DataFrame({'a': [1, pd.np.nan, pd.np.nan, 5, 6], 'b': [0, 1, 2, pd.np.nan, pd.np.nan], 'c': [pd.np.nan, 1, 3, pd.np.nan, 7], 'd': [4, 6, pd.np.nan, 10, 12]}, index=pd.to_datetime(['2020-05-01', '2020-05-11', '2020-05-12', '2020-05-15', '2020-05-30'])) df3
#日時を考慮した補間 df3.interpolate('time')