高度なマージと結合
how、on、left_on/right_on、suffixes を指定した pd.merge() と、時系列結合の merge_asof を学びます。
「高度なマージと結合」はCoddyKit上の無料Learn AI with Pythonレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLearn AI with Python学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Learn AI with Pythonコースには全4レッスンが含まれています。
DataFrameの結合
pd.mergeは、共有するキーを使って2つのDataFrameを結合します。SQLのJOINとまったく同じです。howの各オプションを使いこなすことは、リレーショナルデータを扱ううえで不可欠です。
import pandas as pd
left = pd.DataFrame({"id": [1, 2, 3], "name": ["a", "b", "c"]})
right = pd.DataFrame({"id": [2, 3, 4], "score": [90, 80, 70]})内部結合(デフォルト)
how="inner"は、両方のDataFrameに存在するキーだけを保持します。これがデフォルトです。
print(pd.merge(left, right, on="id", how="inner"))
# id name score
# 0 2 b 90
# 1 3 c 80左外部結合
how="left"は左側のDataFrameのすべての行を保持します。右側に対応するデータがない列はNaNになります。分析で最もよく使われる結合です。
print(pd.merge(left, right, on="id", how="left"))
# id name score
# 0 1 a NaN
# 1 2 b 90.0
# 2 3 c 80.0完全外部結合
how="outer"は、左右両方のすべてのキーを保持し、足りない部分をNaNで埋めます。レコード全体の和集合を確認する場合に使います。
print(pd.merge(left, right, on="id", how="outer"))
# includes id 1 (no score) and id 4 (no name)異なる列名で結合する
キー列の名前が異なる場合は、onの代わりにleft_onとright_onを使います。
r2 = right.rename(columns={"id": "user_id"})
print(pd.merge(left, r2, left_on="id", right_on="user_id"))重複する列のサフィックス
両方のDataFrameにキー以外の同名列がある場合、pandasは_xと_yを付けます。明確にするにはsuffixesで上書きできます。
a = pd.DataFrame({"id": [1], "val": [10]})
b2 = pd.DataFrame({"id": [1], "val": [99]})
print(pd.merge(a, b2, on="id", suffixes=("_old", "_new")))indicator列
indicator=Trueを指定すると、各行の出所を示す_merge列が追加されます。値はleft_only、right_only、またはbothです。結合の監査に非常に役立ちます。
print(pd.merge(left, right, on="id", how="outer", indicator=True))
# _merge tells you where each row came from結合の問題を診断する
indicatorでフィルタリングすると、対応しないキーをすばやく見つけられます。これは、データが気づかないうちに削除される一般的な原因です。
m = pd.merge(left, right, on="id", how="outer", indicator=True)
print(m[m["_merge"] != "both"]) # rows that did not match時系列結合のためのmerge_asof
pd.merge_asofは、完全一致ではなく最も近いキーで結合します。時系列を揃えるために特化した機能で、たとえば各取引に対して直前の最新の気配値を対応付ける場合に使います。両方のDataFrameでキーをソートしておく必要があります。
trades = pd.DataFrame({"time": [1, 3, 7], "price": [10, 11, 12]})
quotes = pd.DataFrame({"time": [0, 2, 5], "bid": [9, 10, 11]})
print(pd.merge_asof(trades, quotes, on="time"))merge_asofの方向
デフォルトでは、merge_asofは過去方向(キー以前で最も新しいキー)に検索します。direction="forward"または"nearest"を使うと、マッチングのルールを変更できます。
print(pd.merge_asof(trades, quotes, on="time", direction="nearest"))適切な結合の選び方
innerは一致した行だけを残す場合、leftは基準となるテーブルに情報を追加する場合、outerはキーの完全な和集合を得る場合、merge_asofは時系列に沿った(近似キーによる)結合に使います。
理解度チェック
結合に関する知識を確認しましょう。
まとめ
結合のツールキット:
how=のinner / left / outerで、どのキーを残すかを制御します- キー列には
onとleft_on/right_onを使い分けます suffixesで重複する名前を区別しますindicator=Trueで行の出所を確認します- 最も近いキーによる時系列結合には
pd.merge_asofを使います(先にソートします)
よくある質問
「高度なマージと結合」レッスンは無料ですか?
はい。「高度なマージと結合」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Learn AI with Pythonコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Learn AI with Pythonコースには全4レッスンが含まれています。
「高度なマージと結合」で何を学びますか?
how、on、left_on/right_on、suffixes を指定した pd.merge() と、時系列結合の merge_asof を学びます。 ブラウザで直接実行するハンズオンコードでLearn AI with Pythonを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Learn AI with Pythonを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのLearn AI with Pythonは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「高度なマージと結合」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このLearn AI with Pythonレッスンでコードを書いて実行できますか?
はい。すべてのLearn AI with Pythonレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。