データ分析実践
上級問題チェック

問題 10 /40

pandasのmerge_asof関数の結果として、誤っているものはどれか。 df1 ▶︎ df2 ▶︎

選択 1

pd.merge_asof(df1, df2, on='日付', direction='nearest') ▶︎

選択 2

pd.merge_asof(df1, df2, on='日付', direction='backward') ▶︎

選択 3

pd.merge_asof(df1, df2, on='日付', direction='forward') ▶︎

選択 4

pd.merge_asof(df1, df2, on='日付', direction='nearest', tolerance=2) ▶︎

解説

選択肢1が正解です。 通常の結合はキーが完全に一致する行同士を結合しますが、merge_asof関数はキーの値が近い行同士を結合することができます。例えば、時刻が厳密に一致しない時系列データ同士を結合する際に使います。 merge_asof関数の結合方法は左外部結合で、左(第一引数)のキーの値に近い右(第二引数)のキーで結合します。how引数による結合方法の指定はできません。 df1 = pd.DataFrame( {'日付':[1,5,10], '左':['a','b','c']}) ▶︎ df2 = pd.DataFrame( {'日付':[1,2,3,6,7], '右':['d','e','f','g','h']}) ▶︎ 【選択肢1】 pd.merge_asof(df1, df2, on='日付', direction='nearest') ▶︎ 誤った結果です。 これはdf1とdf2をmerge関数で左外部結合した結果です。 pd.merge(df1, df2, how='left', on='日付') ▶︎ merge関数の場合、左のキーにある「5」と「10」が右にはないため、この結果になります。 選択肢1の正しい結果は以下です。 pd.merge_asof(df1, df2, on='日付', direction='nearest') ▶︎ merge_asof関数のdirection引数は、次の設定値があります。 nearest ▶︎ 左のキーに対して最も近い右のキーで結合します。 backward ▶︎ 左のキーに対して過去方向に最も近い右のキーで結合します。 forward ▶︎ 左のキーに対して未来方向に最も近い右のキーで結合します。 選択肢1はnearestのため、左の「5」に最も近い右の「6」、左の「10」に最も近い右の「7」をキーにして結合されます。 【選択肢2】 pd.merge_asof(df1, df2, on='日付', direction='backward') ▶︎ 正しい結果です。 backwardは、左のキーに対して過去方向に最も近い右のキーで結合します。そのため、左の「5」の過去方向(古い日付)に最も近い右の「3」、左の「10」の過去方向に最も近い右の「7」をキーにして結合されます。 direction引数のデフォルトはbackwardです。 【選択肢3】 pd.merge_asof(df1, df2, on='日付', direction='forward') ▶︎ 正しい結果です。 forwardは左のキーに対して未来方向に最も近い右のキーで結合します。そのため、左の「5」は未来方向(新しい日付)に最も近い右の「6」をキーにして結合されます。左の「10」の未来方向に最も近い右のキーは存在しないため、NaNになります。 【選択肢4】 pd.merge_asof(df1, df2, on='日付', direction='nearest', tolerance=2) ▶︎ 正しい結果です。 tolerance引数は、結合するキーの値の許容範囲を指定します。「tolerance=2」の場合は3以上離れているとNaNになります。左の「5」に最も近い右の「6」は3以上離れていないため結合されます。左の「10」に最も近い右の「7」は3以上離れているためNaNになります。 (公式書籍 p.87-88)