データ分析実践
上級問題チェック
問題 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)







